From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id GJY9N71iXGebkhUAWB0awg (envelope-from ) for ; Fri, 13 Dec 2024 11:37:17 -0500 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=CsJLp32u; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id DD0D91E097; Fri, 13 Dec 2024 11:37:17 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=unavailable autolearn_force=no version=4.0.0 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 8C9D51E091 for ; Fri, 13 Dec 2024 11:37:15 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3DA673858D35 for ; Fri, 13 Dec 2024 16:37:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3DA673858D35 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=CsJLp32u Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by sourceware.org (Postfix) with ESMTPS id 2D1083857BAF for ; Fri, 13 Dec 2024 16:03:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2D1083857BAF Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 2D1083857BAF Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734105839; cv=none; b=OKYGP9BgwzRm/MdtgnQ1pRkCMix/gqUQ9cnlA5QmEubWK+bduRP8VIM7RZ5TD1KmGs7sVWhzeq+hIX0P6oRi98GECv96xREqItRDSRx9ynJrWr/t3bn0H08ilda9/+e+1AoWK9tL52gOYSHFGd8cZmtM2wKTPJdewlt61nKLWVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734105839; c=relaxed/simple; bh=+NJPbEneLSWbT6LNOMrl58vrjHO/M6Yk64qqTjHN6XI=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=UODxDW/AJPKahG3vjcBRAT16B1A7CpVHCvc6+S4rrHXFuW05g+u8D8iId2kctfv5lteABm1qYBu3bI9z5BwJ6jUmbRU0YsMBnuh+pEp8aHLL5HVc5kH02mEuCLGWDnXL4EO6E+T3W7vp/HSBKTQiD4+T83jht6ZfIkhFp3d8YTM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2D1083857BAF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1734105839; x=1765641839; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+NJPbEneLSWbT6LNOMrl58vrjHO/M6Yk64qqTjHN6XI=; b=CsJLp32uqVSNsAfJOAmhr1GX8jxRAJe4HdZ+4I6vjSVnT/Lr33xdoWH8 uqhITDg4dzOSP65Jgde77iHB6sIOdiAszOvVaClrxgL5PC0lOldIxDM+b hxs1GzH6+hcKE1m6JjI4aXUpMWFhlEZz4yyyp4EeKcyJn7HWLgpliu28X XeGtzuw+Pyv4LwUuNC1DaiR79W9iB2MIuD9vg7avICFKsZmow6wfumtnR tMdPV5M72VvTDffvyzZVO7NdqGCGGE2ZW5mC68Z07h6GVuJ1fmqixCdEP 5NlotcmUt2raLo8NZ3nGD+7+YDHOjVq++4YNLeC3i/nFARmJpZ/5hRK/y A==; X-CSE-ConnectionGUID: ANen4kyTQwanQJv+ddR6Cg== X-CSE-MsgGUID: TABmWkrjTnq0hRytH13eag== X-IronPort-AV: E=McAfee;i="6700,10204,11285"; a="59958322" X-IronPort-AV: E=Sophos;i="6.12,231,1728975600"; d="scan'208";a="59958322" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Dec 2024 08:03:59 -0800 X-CSE-ConnectionGUID: 4lLg+rRIQn29/IExXBMncQ== X-CSE-MsgGUID: pgS4w+dSQYKbw9tzCvS0/g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,231,1728975600"; d="scan'208";a="97125461" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Dec 2024 08:03:56 -0800 From: Tankut Baris Aktemur To: gdb-patches@sourceware.org, Markus Metzger Subject: [PATCH v2 38/47] gdbserver, ze, intelgt: introduce ze-low and intel-ze-low targets Date: Fri, 13 Dec 2024 16:59:55 +0100 Message-Id: <20241213-upstream-intelgt-mvp-v2-38-5c4caeb7b33d@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241213-upstream-intelgt-mvp-v2-0-5c4caeb7b33d@intel.com> References: <20241213-upstream-intelgt-mvp-v2-0-5c4caeb7b33d@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.14.2 Content-Transfer-Encoding: base64 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org RnJvbTogTWFya3VzIE1ldHpnZXIgPG1hcmt1cy50Lm1ldHpnZXJAaW50ZWwuY29tPgoKQWRkIHRo ZSBMZXZlbC1aZXJvIGJhc2VkIGludGVsZ3QgdGFyZ2V0LiAgSXQgaXMgY29uZmlndXJlZCBhcwoK ICBpbnRlbGd0LSotemViaW4KClRoaXMgYWRkcyBmdW5kYW1lbnRhbCBkZWJ1ZyBzdXBwb3J0IGZv ciBJbnRlbCBHVCBkZXZpY2VzLiAgSW4gdGhlCmZ1dHVyZSwgd2UgcGxhbiB0byBhZGQgbW9yZSBw YXRjaGVzIHRoYXQgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UgYXMKd2VsbCB0aGUgdXNlciBleHBl cmllbmNlLiAgVGhvc2UgcGF0Y2hlcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlCmRvd25z dHJlYW0gIkludGVsIERpc3RyaWJ1dGlvbiBmb3IgR0RCIiBkZWJ1Z2dlciBhdAoKICBodHRwczov L2dpdGh1Yi5jb20vaW50ZWwvZ2RiCgpGb3IgTGV2ZWwtWmVybyBiYXNlZCBkZXZpY2VzLCB3ZSBt b2RlbCBoYXJkd2FyZSB0aHJlYWRzLiAgVGhlcmUgaXMgb25lCkdEQiB0aHJlYWQgZm9yIGVhY2gg aGFyZHdhcmUgdGhyZWFkIG9uIHRoZSBkZXZpY2UuCgpXZSBkaXN0aW5ndWlzaCBSVU5OSU5HIGFu ZCBVTkFWQUlMQUJMRSB0aHJlYWQgZXhlY3V0aW9uIHN0YXRlcy4gIFRoZXkKYXJlIHByZXR0eSBz aW1pbGFyIGJ1dCBVTkFWQUlMQUJMRSBtZWFucyB0aGF0IHdlIGhhdmUgdHJpZWQgdG8gc3RvcAp0 aGUgdGhyZWFkIGFuZCBmYWlsZWQsIHdoZXJlYXMgUlVOTklORyBtZWFucyB3ZSBoYXZlIHJlc3Vt ZWQgdGhlCnRocmVhZCBhbmQgc2luY2Ugbm90IHRyaWVkIHRvIGludGVyYWN0IHdpdGggaXQuCgpP biBhdHRhY2ggdG8gUElELCBhdHRhY2ggdG8gdGhhdCBQSUQgb24gYWxsIHN1cHBvcnRlZCBkZXZp Y2VzIGFuZApjcmVhdGUgdGFyZ2V0IGRlc2NyaXB0aW9ucyBhbmQgYSBwcm9jZXNzIGZvciBlYWNo IGRldmljZS4gIFRoaXMKdmVyc2lvbiBkb2VzIG5vdCBhbGxvdyBhdHRhY2hpbmcgdG8gb3IgZGV0 YWNoaW5nIGZyb20gYW5kIHJlYXR0YWNoaW5nCnRvIGluZGl2aWR1YWwgZGV2aWNlcy4KClRoZSB0 YXJnZXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhIG5hdGl2ZSB0YXJnZXQsIHJl bHlpbmcgb24KR0RCJ3MgbXVsdGktdGFyZ2V0IGZlYXR1cmUsIHRvIGRlYnVnIHRoZSBHUFUgYW5k IHRoZSBob3N0IGFwcGxpY2F0aW9uCmluIHRoZSBzYW1lIGRlYnVnIHNlc3Npb24uICBGb3IgdGhp cywgYnJpbmcgdGhlIG5hdGl2ZSBhcHAgdG8gYSBzdGF0ZQp3aGVyZSB0aGUgTGV2ZWwtWmVybyBi YWNrZW5kIGZvciB0aGUgR1BVIGhhcyBiZWVuIGluaXRpYWxpemVkLCB0aGVuCmNyZWF0ZSBhIGdk YnNlcnZlciBpbnN0YW5jZSBhbmQgY29ubmVjdCB0byBpdCBmcm9tIGEgc2Vjb25kIGluZmVyaW9y LgoKQmVsb3cgaXMgYSBzYW1wbGUgc2Vzc2lvbiB0aGF0IHNob3dzIGhvdyB0byBkbyB0aGlzIG1h bnVhbGx5LiAgSW4gdGhlCmRvd25zdHJlYW0gZGVidWdnZXIsIGEgUHl0aG9uIHNjcmlwdCBpcyB1 c2VkIHRvIHRha2UgdGhlc2Ugc3RlcHMKaW4gYW4gYXV0b21hdGVkIG1hbm5lciBmb3IgYmV0dGVy IHVzZXIgZXhwZXJpZW5jZS4KCiAgJCBnZGIgZGVtbwogIC4uLgogIChnZGIpIG1haW50ZW5hbmNl IHNldCB0YXJnZXQtbm9uLXN0b3Agb24KICAoZ2RiKSB0YnJlYWsgNjAKICBUZW1wb3JhcnkgYnJl YWtwb2ludCAxIGF0IDB4NDA0OWM4OiBmaWxlIGRlbW8uY3BwLCBsaW5lIDYwLgogIChnZGIpIHJ1 bgogIC4uLgogIFtTWUNMXSBVc2luZyBkZXZpY2U6IFtJbnRlbChSKSBBcmMoVE0pIEE3NTAgR3Jh cGhpY3NdIGZyb20gW0ludGVsKFIpIExldmVsLVplcm9dCgogIFRocmVhZCAxICJkZW1vIiBoaXQg VGVtcG9yYXJ5IGJyZWFrcG9pbnQgMSwgbWFpbiAoYXJnYz0xLCBhcmd2PTB4N2ZmZmZmZmZkOWI4 KSBhdCBkZW1vLmNwcDo2MAogIDYwICAgICAgICAgIHJhbmdlIGRhdGFfcmFuZ2V7bGVuZ3RofTsK ICAoZ2RiKQoKICAjIENvbm5lY3QgdGhlIEludGVsIEdUIGdkYnNlcnZlciBieSBzcGVjaWZ5aW5n IHRoZSBob3N0IGluZmVyaW9yIFBJRC4KCiAgKGdkYikgYWRkLWluZmVyaW9yIC1uby1jb25uZWN0 aW9uCiAgW05ldyBpbmZlcmlvciAyXQogIEFkZGVkIGluZmVyaW9yIDIKICAoZ2RiKSBpbmZlcmlv ciAyCiAgW1N3aXRjaGluZyB0byBpbmZlcmlvciAyIFs8bnVsbD5dICg8bm9leGVjPildCiAgKGdk YikgaW5mbyBpbmZlcmlvcnMKICAgIE51bSAgRGVzY3JpcHRpb24gICAgICAgQ29ubmVjdGlvbiAg ICAgICAgICAgRXhlY3V0YWJsZQogICAgMSAgICBwcm9jZXNzIDE2NDU4ICAgICAxIChuYXRpdmUp ICAgICAgICAgICAvdGVtcC9kZW1vCiAgKiAyICAgIDxudWxsPgogIChnZGIpIHRhcmdldCByZW1v dGUgfCBnZGJzZXJ2ZXItemUgLS1hdHRhY2ggLSAxNjQ1OAogIFJlbW90ZSBkZWJ1Z2dpbmcgdXNp bmcgfCBnZGJzZXJ2ZXItemUgLS1hdHRhY2ggLSAxNjQ1OAogIEF0dGFjaGVkOyBnaXZlbiBwaWQg PSAxNjQ1OCwgdXBkYXRlZCB0byAxCiAgUmVtb3RlIGRlYnVnZ2luZyB1c2luZyBzdGRpbwogIDx1 bmF2YWlsYWJsZT4gaW4gPz8gKCkKICAoZ2RiKQoKICAjIEZvciAiY29udGludWUiIHRvIGNvbnZl bmllbnRseSByZXN1bWUgYm90aCBpbmZlcmlvcnMsCiAgIyBzZXQgdGhlICdzY2hlZHVsZS1tdWx0 aScgbW9kZS4gIFRoZW4gZGVmaW5lIGEgYnJlYWtwb2ludAogICMgaW5zaWRlIHRoZSBrZXJuZWwg YW5kIHJlc3VtZSB0byBoaXQgdGhhdCBCUC4KCiAgKGdkYikgc2V0IHNjaGVkdWxlLW11bHRpcGxl IG9uCiAgKGdkYikgYnJlYWsgZGVtby5jcHA6MzIKICBCcmVha3BvaW50IDIgYXQgMHg0MDY1MWY6 IGZpbGUgZGVtby5jcHAsIGxpbmUgMzIuCiAgKGdkYikgY29udGludWUKICBDb250aW51aW5nLgog IC4uLgogIFRocmVhZCAyLjIwMSBoaXQgQnJlYWtwb2ludCAyLjIsIGNvbXB1dGUgKGluZGV4PXN5 Y2w6Ol9WMTo6aWQ8MT4gPSB7Li4ufSwKICAgIGVsZW1lbnQ9MTE2KSBhdCBkZW1vLmNwcDozMgog IDMyICAgICAgICBzaXplX3QgaWQwID0gR2V0RGltKGluZGV4LCAwKTsKICAoZ2RiKQoKT24gSW50 ZWwgR1QsIHRoZSAzMmIgSVAgcmVnaXN0ZXIgaG9sZHMgdGhlIG9mZnNldCBmcm9tIHRoZSA2NGIK SW5zdHJ1Y3Rpb24gQmFzZSBBZGRyZXNzLCB3aGljaCB3ZSBtb2RlbCBhcyB2aXJ0dWFsICdpc2Fi YXNlJwpyZWdpc3Rlci4KCldlIHBvcnQgYXN5bmMgc3VwcG9ydCBmcm9tIGxpbnV4LWxvdy5jYy4g IFRoZXJlIGlzIG5vIG5lZWQgdG8gbWFzawpTSUdDSExEIGR1cmluZyBwaXBlIGluaXRpYWxpemF0 aW9uIGFzIHdlJ3JlIG5vdCB1c2luZyBwdHJhY2UuICBXZSByZWx5Cm9uIEdEQiBleHBsaWNpdGx5 IHJlcXVlc3RpbmcgYWxsLXN0b3Avbm9uLXN0b3AgbW9kZSB0byBlbmFibGUgYXN5bmMuCgpGb3Ig TGV2ZWwtWmVybyB0YXJnZXRzLCBtb2R1bGUgbG9hZCBhbmQgdW5sb2FkIGV2ZW50cyBhcmUgc2Vu dCBpbiB0aGUKY29udGV4dCBvZiB0aGUgaG9zdCBwcm9jZXNzLiAgVGhleSBibG9jayBhIGhvc3Qg c3lzdGVtIGNhbGwgdW50aWwgYW4KYXR0YWNoZWQgZGVidWdnZXIgYWNrbm93bGVkZ2VzIHRoZSBl dmVudCB0byBnaXZlIGl0IGVub3VnaCB0aW1lIHRvIHBsYWNlCmJyZWFrcG9pbnRzIGJlZm9yZSB0 aGUgbW9kdWxlIG1heSBiZSB1c2VkLgoKQWNjZXNzaW5nIHRoZSBtZW1vcnkgcmVxdWlyZXMgc3Bl Y2lmeWluZyBhIGRlYnVnIHNlc3Npb24gaGFuZGxlLCB3aGljaAppcyBhdmFpbGFibGUgdGhyb3Vn aCBhIHRocmVhZC4gIEZvciBjb252ZW5pZW5jZSwgd2UgaW50cm9kdWNlCm92ZXJsb2FkZWQgdmVy c2lvbnMgb2YgcmVhZF9tZW1vcnkgYW5kIHdyaXRlX21lbW9yeSB0aGF0IHRha2UgYQpgdGhyZWFk X2luZm8gKmAgdG8gZGVub3RlIHRoZSBjb250ZXh0IGluIHdoaWNoIG1lbW9yeSBzaG91bGQgYmUK YWNjZXNzZWQuICBUaGUgZXhpc3RpbmcgcmVhZF9tZW1vcnkgYW5kIHdyaXRlX21lbW9yeSB0YXJn ZXQgb3BzIHVzZQp0aGUgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBzaW1wbHkgYnkgcGFzc2luZyBjdXJy ZW50X3RocmVhZC4KCldoZW4gR0RCIHNlbmRzIGFuIGludGVycnVwdCwgc29tZSB0aHJlYWRzIG1h eSB0dXJuIG91dCB0byBiZQp1bmF2YWlsYWJsZS4gIEZyb20gR0RCJ3MgUG9WLCB0aG9zZSB0aHJl YWRzIGFyZSBub3QgcnVubmluZy4gIEhvd2V2ZXIsCnRoZXkgbWF5IGVtaXQgZXZlbnRzLiAgSW4g YWxsLXN0b3AgbW9kZSwgdGhvc2UgZXZlbnRzIGFyZSBub3QgZmV0Y2hlZAp1bnRpbCBHREIgcmVz dW1lcyB0aGUgdGhyZWFkcywgZHVlIHRvIHRoZSBzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uCm1v ZGVsLiAgSW4gbm9uLXN0b3AgbW9kZSwgaG93ZXZlciwgdGhlIGV2ZW50cyBtYXkgYmUgZmV0Y2hl ZC4gIFdoZW4KdGhleSBhcmUgc2VudCB0byBHREIsIHRoZXkgY2FuIGNhdXNlIGNvbmZ1c2lvbiwg aW4gcGFydGljdWxhciB3aGVuIEdEQgpjb21taXRzIHJlc3VtZSByZXF1ZXN0cy4gIFRvIHByZXZl bnQgYSBzdGF0ZSBtaXNtYXRjaCwgd2UgaG9sZCBldmVudHMKdGhhdCBhcmlzZSBmcm9tIHVuYXZh aWxhYmxlIHRocmVhZHMgd2hvc2UgcmVzdW1lIHN0YXRlIGlzICdzdG9wJy4KT25jZSBHREIgc2Vu ZHMgcmVzdW1lIHJlcXVlc3RzIGZvciB0aGVzZSB0aHJlYWRzLCB3ZSB1bmxlYXNoIHRoZQpldmVu dC4KCkNvLWF1dGhvcmVkLWJ5OiBUYW5rdXQgQmFyaXMgQWt0ZW11ciA8dGFua3V0LmJhcmlzLmFr dGVtdXJAaW50ZWwuY29tPgpDby1hdXRob3JlZC1ieTogTmF0YWxpYSBTYWlhcG92YSA8bmF0YWxp YS5zYWlhcG92YUBpbnRlbC5jb20+CgpDYzogPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+CkNjOiA8 YmludXRpbHNAc291cmNld2FyZS5vcmc+Ci0tLQogY29uZmlnLnN1YiAgICAgICAgICAgICAgICAg IHwgICAgNCArLQogZ2Ric2VydmVyL01ha2VmaWxlLmluICAgICAgIHwgICAgNCArLQogZ2Ric2Vy dmVyL2NvbmZpZy5pbiAgICAgICAgIHwgICAgNiArCiBnZGJzZXJ2ZXIvY29uZmlndXJlICAgICAg ICAgfCAgNTAwICsrKysrKysrCiBnZGJzZXJ2ZXIvY29uZmlndXJlLmFjICAgICAgfCAgIDE4ICsK IGdkYnNlcnZlci9jb25maWd1cmUuc3J2ICAgICB8ICAgIDQgKwogZ2Ric2VydmVyL2dkYnRocmVh ZC5oICAgICAgIHwgICAgMiArLQogZ2Ric2VydmVyL2ludGVsZ3QtemUtbG93LmNjIHwgMTA0MSAr KysrKysrKysrKysrKysKIGdkYnNlcnZlci96ZS1sb3cuY2MgICAgICAgICB8IDI5OTUgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZ2Ric2VydmVyL3plLWxvdy5o ICAgICAgICAgIHwgIDQ5MiArKysrKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCA1MDYyIGluc2VydGlv bnMoKyksIDQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5z dWIKaW5kZXggNjNmZjk1OGVjMTI1ZTU0MzY3NGU5YjI2MWQ1ZTViYjJmYTc0OWM0ZS4uM2IzMWY2 MTgxN2JkODA0ZWM4OWZjNTI1YTAxNDM2NWFlNTI4ZDY1MSAxMDA3NTUKLS0tIGEvY29uZmlnLnN1 YgorKysgYi9jb25maWcuc3ViCkBAIC0xNzY5LDcgKzE3NjksNyBAQCBjYXNlICRvcyBpbgogCSAg ICAgfCBvbmVmcyogfCB0aXJ0b3MqIHwgcGhvZW5peCogfCBmdWNoc2lhKiB8IHJlZG94KiB8IGJt ZSogXAogCSAgICAgfCBtaWRuaWdodGJzZCogfCBhbWRoc2EqIHwgdW5sZWFzaGVkKiB8IGVtc2Ny aXB0ZW4qIHwgd2FzaSogXAogCSAgICAgfCBuc2sqIHwgcG93ZXJ1bml4KiB8IGdlbm9kZSogfCB6 dm1vZSogfCBxbngqIHwgZW14KiB8IHplcGh5ciogXAotCSAgICAgfCBmaXdpeCogfCBtbGliYyog fCBjb3MqIHwgbWJyKiB8IGlyb25jbGFkKiApCisJICAgICB8IGZpd2l4KiB8IG1saWJjKiB8IGNv cyogfCBtYnIqIHwgaXJvbmNsYWQqIHwgemUqKQogCQk7OwogCSMgVGhpcyBvbmUgaXMgZXh0cmEg c3RyaWN0IHdpdGggYWxsb3dlZCB2ZXJzaW9ucwogCXNjbzMuMnYyIHwgc2NvMy4ydls0LTldKiB8 IHNjbzV2NiopCkBAIC0xODMwLDcgKzE4MzAsNyBAQCBlc2FjCiBjYXNlICRrZXJuZWwtJG9zLSRv YmogaW4KIAlsaW51eC1nbnUqLSB8IGxpbnV4LWFuZHJvaWQqLSB8IGxpbnV4LWRpZXRsaWJjKi0g fCBsaW51eC1sbHZtKi0gXAogCQkgICAgfCBsaW51eC1tbGliYyotIHwgbGludXgtbXVzbCotIHwg bGludXgtbmV3bGliKi0gXAotCQkgICAgfCBsaW51eC1yZWxpYmMqLSB8IGxpbnV4LXVjbGliYyot ICkKKwkJICAgIHwgbGludXgtcmVsaWJjKi0gfCBsaW51eC11Y2xpYmMqLSB8IGxpbnV4LXplKi0g KQogCQk7OwogCXVjbGludXgtdWNsaWJjKi0gKQogCQk7OwpkaWZmIC0tZ2l0IGEvZ2Ric2VydmVy L01ha2VmaWxlLmluIGIvZ2Ric2VydmVyL01ha2VmaWxlLmluCmluZGV4IDM2NWRjZjIzNjUwNDc2 MzA1ZGFjYzQyMWM0MjZmZTU0ZjQwMDMzMDEuLjc1YTVlNjg1MjkxYWYyMjA3NzA3ZWQ2NTY1Zjll Y2JkZmMyYmM2YjIgMTAwNjQ0Ci0tLSBhL2dkYnNlcnZlci9NYWtlZmlsZS5pbgorKysgYi9nZGJz ZXJ2ZXIvTWFrZWZpbGUuaW4KQEAgLTEwOCw2ICsxMDgsOCBAQCBHREJTVVBQT1JUID0gJChHREJT VVBQT1JUX0JVSUxERElSKS9saWJnZGJzdXBwb3J0LmEKIHVzdGxpYnMgPSBAdXN0bGlic0AKIHVz dGluYyA9IEB1c3RpbmNACiAKK0xJQlpFX0xPQURFUiA9IEBMSUJaRV9MT0FERVJACisKICMgZ251 bGliCiBHTlVMSUJfUEFSRU5UX0RJUiA9IC4uCiBpbmNsdWRlICQoR05VTElCX1BBUkVOVF9ESVIp L2dudWxpYi9NYWtlZmlsZS5nbnVsaWIuaW5jCkBAIC0zNzIsNyArMzc0LDcgQEAgZ2Ric2VydmVy JChFWEVFWFQpOiAkKHNvcnQgJChPQlMpKSAke0NERVBTfSAkKExJQkdOVSkgJChMSUJJQkVSVFkp IFwKIAkJJChDWFhGTEFHUykgXAogCQktbyBnZGJzZXJ2ZXIkKEVYRUVYVCkgJChPQlMpICQoR0RC U1VQUE9SVCkgJChMSUJHTlUpIFwKIAkJJChMSUJHTlVfRVhUUkFfTElCUykgJChMSUJJQkVSVFkp ICQoSU5UTCkgXAotCQkkKEdEQlNFUlZFUl9MSUJTKSAkKFhNX0NMSUJTKSAkKFdJTjMyQVBJTElC UykgJChNQVlCRV9MSUJJQ09OVikKKwkJJChHREJTRVJWRVJfTElCUykgJChYTV9DTElCUykgJChX SU4zMkFQSUxJQlMpICQoTUFZQkVfTElCSUNPTlYpICQoTElCWkVfTE9BREVSKQogCiBnZGJyZXBs YXkkKEVYRUVYVCk6ICQoc29ydCAkKEdEQlJFUExBWV9PQlMpKSAkKExJQkdOVSkgJChMSUJJQkVS VFkpIFwKIAkJJChJTlRMX0RFUFMpICQoR0RCU1VQUE9SVCkKZGlmZiAtLWdpdCBhL2dkYnNlcnZl ci9jb25maWcuaW4gYi9nZGJzZXJ2ZXIvY29uZmlnLmluCmluZGV4IDY1ZjlmZjZlNjQ3MDM2OWNl ODQ4N2UwZWEzYmRiMTg2ZjMyM2Y3YjEuLjI4YTQ5ZWY1YWM5N2Q1ZjdmNTM4Y2Y3NGE3MTMwNGFm MjdkMjFjYmUgMTAwNjQ0Ci0tLSBhL2dkYnNlcnZlci9jb25maWcuaW4KKysrIGIvZ2Ric2VydmVy L2NvbmZpZy5pbgpAQCAtMTU4LDkgKzE1OCwxNSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhh dmUgdGhlIGBkbCcgbGlicmFyeSAoLWxkbCkuICovCiAjdW5kZWYgSEFWRV9MSUJETAogCisvKiBE ZWZpbmUgaWYgeW91IGhhdmUgdGhlIGlnZnhkYmcgbGlicmFyeS4gKi8KKyN1bmRlZiBIQVZFX0xJ QklHRlhEQkcKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpcHQgbGlicmFyeS4gKi8KICN1 bmRlZiBIQVZFX0xJQklQVAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHplX2xvYWRlciBs aWJyYXJ5LiAqLworI3VuZGVmIEhBVkVfTElCWkVfTE9BREVSCisKIC8qIERlZmluZSBpZiB5b3Ug aGF2ZSB0aGUgeHhoYXNoIGxpYnJhcnkuICovCiAjdW5kZWYgSEFWRV9MSUJYWEhBU0gKIApkaWZm IC0tZ2l0IGEvZ2Ric2VydmVyL2NvbmZpZ3VyZSBiL2dkYnNlcnZlci9jb25maWd1cmUKaW5kZXgg MzI5ODBlNTAxN2VkZjg4YWU5OWQ0NjBlOTI3ODdkYWFkYjBlZGRhZS4uMDJmZGZhYWY4MDM2MzA4 NDllMzVmZmNhNzk2NDA0NzFkNTAwNGJkNSAxMDA3NTUKLS0tIGEvZ2Ric2VydmVyL2NvbmZpZ3Vy ZQorKysgYi9nZGJzZXJ2ZXIvY29uZmlndXJlCkBAIC02MzEsNiArNjMxLDkgQEAgc3J2X3htbGZp bGVzCiBzcnZfeG1sYnVpbHRpbgogR0RCU0VSVkVSX0xJQlMKIEdEQlNFUlZFUl9ERVBGSUxFUwor TFRMSUJaRV9MT0FERVIKK0xJQlpFX0xPQURFUgorSEFWRV9MSUJaRV9MT0FERVIKIFJEWU5BTUlD CiBSRVBPUlRfQlVHU19URVhJCiBSRVBPUlRfQlVHU19UTwpAQCAtNzg1LDYgKzc4OCw4IEBAIHdp dGhfcGtndmVyc2lvbgogd2l0aF9idWd1cmwKIHdpdGhfbGlidGhyZWFkX2RiCiBlbmFibGVfaW5w cm9jZXNzX2FnZW50Cit3aXRoX2xpYnplX2xvYWRlcl9wcmVmaXgKK3dpdGhfbGliemVfbG9hZGVy X3R5cGUKICcKICAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCiBob3N0X2FsaWFz CkBAIC0xNDYwLDYgKzE0NjUsOSBAQCBPcHRpb25hbCBQYWNrYWdlczoKICAgLS13aXRoLWJ1Z3Vy bD1VUkwgICAgICAgRGlyZWN0IHVzZXJzIHRvIFVSTCB0byByZXBvcnQgYSBidWcKICAgLS13aXRo LWxpYnRocmVhZC1kYj1QQVRICiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBnaXZlbiBs aWJ0aHJlYWRfZGIgZGlyZWN0bHkKKyAgLS13aXRoLWxpYnplX2xvYWRlci1wcmVmaXhbPURJUl0g IHNlYXJjaCBmb3IgbGliemVfbG9hZGVyIGluIERJUi9pbmNsdWRlIGFuZCBESVIvbGliCisgIC0t d2l0aG91dC1saWJ6ZV9sb2FkZXItcHJlZml4ICAgICBkb24ndCBzZWFyY2ggZm9yIGxpYnplX2xv YWRlciBpbiBpbmNsdWRlZGlyIGFuZCBsaWJkaXIKKyAgLS13aXRoLWxpYnplX2xvYWRlci10eXBl PVRZUEUgICAgIHR5cGUgb2YgbGlicmFyeSB0byBzZWFyY2ggZm9yIChhdXRvL3N0YXRpYy9zaGFy ZWQpCiAKIFNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgogICBDQyAgICAg ICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKQEAgLTE0ODA1LDYgKzE0ODEzLDQ5OCBAQCBmaQogCiAK IAorCisgICAgdXNlX2FkZGl0aW9uYWw9eWVzCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4 IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0i JGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKwor ICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwg YWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKworICBleGVjX3ByZWZpeD0iJGFjbF9zYXZl X2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKworIyBDaGVjayB3 aGV0aGVyIC0td2l0aC1saWJ6ZV9sb2FkZXItcHJlZml4IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7 d2l0aF9saWJ6ZV9sb2FkZXJfcHJlZml4K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0k d2l0aF9saWJ6ZV9sb2FkZXJfcHJlZml4OworICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWG5v IjsgdGhlbgorICAgICAgdXNlX2FkZGl0aW9uYWw9bm8KKyAgICBlbHNlCisgICAgICBpZiB0ZXN0 ICJYJHdpdGh2YWwiID0gIlgiOyB0aGVuCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4Igor ICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4 ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKworICAg ICAgICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgICAg ICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKworICBleGVjX3ByZWZpeD0i JGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAg ICAgIGVsc2UKKyAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkd2l0aHZhbC9pbmNsdWRl IgorICAgICAgICBhZGRpdGlvbmFsX2xpYmRpcj0iJHdpdGh2YWwvbGliIgorICAgICAgZmkKKyAg ICBmaQorCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGliemVfbG9hZGVyLXR5cGUg d2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xpYnplX2xvYWRlcl90eXBlK3NldH0iID0gc2V0 OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9saWJ6ZV9sb2FkZXJfdHlwZTsgIHdpdGhfbGliemVf bG9hZGVyX3R5cGU9JHdpdGh2YWwKK2Vsc2UKKyAgIHdpdGhfbGliemVfbG9hZGVyX3R5cGU9YXV0 bworZmkKKworICBsaWJfdHlwZT1gZXZhbCBlY2hvIFwkd2l0aF9saWJ6ZV9sb2FkZXJfdHlwZWAK KworICAgICAgTElCWkVfTE9BREVSPQorICBMVExJQlpFX0xPQURFUj0KKyAgSU5DWkVfTE9BREVS PQorICBycGF0aGRpcnM9CisgIGx0cnBhdGhkaXJzPQorICBuYW1lc19hbHJlYWR5X2hhbmRsZWQ9 CisgIG5hbWVzX25leHRfcm91bmQ9J3plX2xvYWRlciAnCisgIHdoaWxlIHRlc3QgLW4gIiRuYW1l c19uZXh0X3JvdW5kIjsgZG8KKyAgICBuYW1lc190aGlzX3JvdW5kPSIkbmFtZXNfbmV4dF9yb3Vu ZCIKKyAgICBuYW1lc19uZXh0X3JvdW5kPQorICAgIGZvciBuYW1lIGluICRuYW1lc190aGlzX3Jv dW5kOyBkbworICAgICAgYWxyZWFkeV9oYW5kbGVkPQorICAgICAgZm9yIG4gaW4gJG5hbWVzX2Fs cmVhZHlfaGFuZGxlZDsgZG8KKyAgICAgICAgaWYgdGVzdCAiJG4iID0gIiRuYW1lIjsgdGhlbgor ICAgICAgICAgIGFscmVhZHlfaGFuZGxlZD15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBm aQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAteiAiJGFscmVhZHlfaGFuZGxlZCI7IHRoZW4K KyAgICAgICAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPSIkbmFtZXNfYWxyZWFkeV9oYW5kbGVkICRu YW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJuYW1lPWBlY2hvICIkbmFtZSIgfCBz ZWQgLWUgJ3l8YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy18QUJDREVGR0hJSktMTU5PUFFS U1RVVldYWVpfX198J2AKKyAgICAgICAgZXZhbCB2YWx1ZT1cIlwkSEFWRV9MSUIkdXBwZXJuYW1l XCIKKyAgICAgICAgaWYgdGVzdCAtbiAiJHZhbHVlIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3Qg IiR2YWx1ZSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExJQiR1cHBl cm5hbWVcIgorICAgICAgICAgICAgdGVzdCAteiAiJHZhbHVlIiB8fCBMSUJaRV9MT0FERVI9IiR7 TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisgfSR2YWx1ZSIKKyAgICAgICAgICAgIGV2YWwg dmFsdWU9XCJcJExUTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUi IHx8IExUTElCWkVfTE9BREVSPSIke0xUTElCWkVfTE9BREVSfSR7TFRMSUJaRV9MT0FERVI6KyB9 JHZhbHVlIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDoKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBmb3VuZF9kaXI9CisgICAgICAgICAgZm91bmRfbGE9CisgICAgICAgICAgZm91bmRf c289CisgICAgICAgICAgZm91bmRfYT0KKyAgICAgICAgICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25h bCA9IHllczsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0 IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IiAmJiB0ZXN0IHgkbGli X3R5cGUgIT0geHN0YXRpYzsgdGhlbgorICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlv bmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgZm91bmRfc289IiRhZGRpdGlvbmFsX2xpYmRpci9s aWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFs X2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFk ZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICBmaQorICAgICAgICAg ICAgZWxpZiB0ZXN0IHgkbGliX3R5cGUgIT0geHNoYXJlZDsgdGhlbgorICAgICAgICAgICAgICBp ZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAg ICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAg ICAgICBmb3VuZF9hPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAg ICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0 aGVuCisgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRu YW1lLmxhIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAg ICBmaQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgi OyB0aGVuCisgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTFRMSUJaRV9MT0FERVI7IGRv CisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJl Zml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZp eD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZp eD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisK KyAgICAgICAgICAgICAgY2FzZSAiJHgiIGluCisgICAgICAgICAgICAgICAgLUwqKQorICAgICAg ICAgICAgICAgICAgZGlyPWBlY2hvICJYJHgiIHwgc2VkIC1lICdzL15YLUwvLydgCisgICAgICAg ICAgICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJleHQiICYmIHRlc3QgLWYgIiRkaXIvbGliJG5h bWUuJHNobGliZXh0IiAmJiB0ZXN0IHgkbGliX3R5cGUgIT0geHN0YXRpYzsgdGhlbgorICAgICAg ICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRkaXIiCisgICAgICAgICAgICAgICAgICAgIGZvdW5k X3NvPSIkZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCIKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVz dCAtZiAiJGRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBmb3Vu ZF9sYT0iJGRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAg ICAgICAgICAgIGVsaWYgdGVzdCB4JGxpYl90eXBlICE9IHhzaGFyZWQ7IHRoZW4KKyAgICAgICAg ICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kbGliZXh0IjsgdGhlbgorICAg ICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKyAgICAgICAgICAgICAgICAgICAg ICBmb3VuZF9hPSIkZGlyL2xpYiRuYW1lLiRsaWJleHQiCisgICAgICAgICAgICAgICAgICAgICAg aWYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAg ICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgICAgICAgIGZp CisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAg ICAgICAgICAgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBpZiB0ZXN0ICJY JGZvdW5kX2RpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAg ICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIGlmIHRl c3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIExU TElCWkVfTE9BREVSPSIke0xUTElCWkVfTE9BREVSfSR7TFRMSUJaRV9MT0FERVI6KyB9LUwkZm91 bmRfZGlyIC1sJG5hbWUiCisgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX3NvIiAhPSAiWCI7 IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgPSBubyB8fCB0ZXN0ICJYJGZvdW5kX2RpciIg PSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJa RV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisgfSRmb3VuZF9zbyIKKyAg ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAg ICAgICAgICAgZm9yIHggaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgaWYg dGVzdCAiWCR4IiA9ICJYJGZvdW5kX2RpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaGF2 ZWl0PXllcworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgZmkK KyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVp dCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGx0cnBhdGhkaXJzPSIkbHRycGF0aGRpcnMgJGZv dW5kX2RpciIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCWkVfTE9BREVSPSIk e0xJQlpFX0xPQURFUn0ke0xJQlpFX0xPQURFUjorIH0kZm91bmRfc28iCisgICAgICAgICAgICAg ICAgZWxzZQorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9m bGFnX3NwZWMiICYmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJa RV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisgfSRmb3VuZF9zbyIKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAg ICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgor ICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAg ICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBk b25lCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAg ICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRmb3VuZF9kaXIiCisgICAg ICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1Mg JExJQlpFX0xPQURFUjsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZp eD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVm aXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIk eFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFj bF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAi WC1MJGZvdW5kX2RpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMK KyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgZmkK KyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16 ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtM SUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9LUwkZm91bmRfZGlyIgorICAgICAgICAgICAg ICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNf TCIgIT0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJaRV9MT0FE RVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisgfSRmb3VuZF9zbyIKKyAgICAgICAg ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBMSUJaRV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElC WkVfTE9BREVSOisgfS1sJG5hbWUiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAg ICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAg ICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfYSIgIT0gIlgiOyB0aGVu CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtMSUJaRV9M T0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9JGZvdW5kX2EiCisgICAgICAgICAgICAgIGVsc2UKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURF Uj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9LUwkZm91bmRfZGlyIC1sJG5hbWUi CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAg ICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPQorICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2RpciIg aW4KKyAgICAgICAgICAgICAgKi9saWIgfCAqL2xpYi8pCisgICAgICAgICAgICAgICAgYmFzZWRp cj1gZWNobyAiWCRmb3VuZF9kaXIiIHwgc2VkIC1lICdzLF5YLCwnIC1lICdzLC9saWIvKiQsLCdg CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkYmFzZWRpci9pbmNsdWRl IgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBpZiB0 ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRp dGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYL3Vzci9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgICAg ICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVk ZWRpciIgPSAiWC91c3IvbG9jYWwvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGlm IHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3Mg aW4KKyAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworICAgICAgICAg ICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZp CisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAg ICAgICAgIGZvciB4IGluICRDUFBGTEFHUyAkSU5DWkVfTE9BREVSOyBkbworCisgIGFjbF9zYXZl X3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3Nh dmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxf ZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9l eGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAgICAg ICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4K KyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAg YnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGRvbmUKKyAg ICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAg ICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1pFX0xPQURFUj0iJHtJTkNa RV9MT0FERVJ9JHtJTkNaRV9MT0FERVI6KyB9LUkkYWRkaXRpb25hbF9pbmNsdWRlZGlyIgorICAg ICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAg ICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAg ICAgICAgIGlmIHRlc3QgLW4gIiRmb3VuZF9sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV9saWJkaXI9IiRsaWJkaXIi CisgICAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9sYSIgaW4KKyAgICAgICAgICAgICAgICAqLyog fCAqXFwqKSAuICIkZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgICAgKikgLiAiLi8kZm91bmRf bGEiIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgbGliZGlyPSIkc2F2ZV9s aWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiAkZGVwZW5kZW5j eV9saWJzOyBkbworICAgICAgICAgICAgICAgIGNhc2UgIiRkZXAiIGluCisgICAgICAgICAgICAg ICAgICAtTCopCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPWBlY2hvICJY JGRlcCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiAhPSAiWC91c3Iv bGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAg ICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiA9ICJYL3Vzci9sb2NhbC9saWIi OyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgor ICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAg ICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVu CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAg ICBmb3IgeCBpbiAkTERGTEFHUyAkTElCWkVfTE9BREVSOyBkbworCisgIGFjbF9zYXZlX3ByZWZp eD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhl Y19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19w cmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3By ZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAgICAgICAgICAg ICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAg ICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhh dmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0 aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBMSUJaRV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVf TE9BREVSOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAg ICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAg IGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMVExJ QlpFX0xPQURFUjsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0i JGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgi CisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwi CisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9z YXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0g IlgtTCRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAg ICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAg ICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRM SUJaRV9MT0FERVI9IiR7TFRMSUJaRV9MT0FERVJ9JHtMVExJQlpFX0xPQURFUjorIH0tTCRhZGRp dGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAg ICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAg ICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgIC1SKikK KyAgICAgICAgICAgICAgICAgICAgZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtUi8v J2AKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgIT0gbm87IHRo ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkcnBh dGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGRp ciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAg ICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAg ICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAi JGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJwYXRoZGlycz0iJHJwYXRo ZGlycyAkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9Cisg ICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgICAg ICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGRpciI7IHRoZW4KKyAgICAgICAgICAg ICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh aworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkb25l CisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAg ICAgICAgICAgICAgICAgICAgIGx0cnBhdGhkaXJzPSIkbHRycGF0aGRpcnMgJGRpciIKKyAgICAg ICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAg ICAgICAgICA7OworICAgICAgICAgICAgICAgICAgLWwqKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG5hbWVzX25leHRfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kICJg ZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLWwvLydgCisgICAgICAgICAgICAgICAgICAgIDs7 CisgICAgICAgICAgICAgICAgICAqLmxhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19u ZXh0X3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCAiYGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncyxe WC4qLywsJyAtZSAncyxebGliLCwnIC1lICdzLFwubGEkLCwnYAorICAgICAgICAgICAgICAgICAg ICA7OworICAgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBMSUJaRV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisg fSRkZXAiCisgICAgICAgICAgICAgICAgICAgIExUTElCWkVfTE9BREVSPSIke0xUTElCWkVfTE9B REVSfSR7TFRMSUJaRV9MT0FERVI6KyB9JGRlcCIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAg ICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGZpCisg ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRsaWJfdHlwZSIgPSAieGF1dG8iIHx8IHRlc3Qg IngkbGliX3R5cGUiID0gInhzaGFyZWQiOyB0aGVuCisgICAgICAgICAgICAgIExJQlpFX0xPQURF Uj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9LWwkbmFtZSIKKyAgICAgICAgICAg ICAgTFRMSUJaRV9MT0FERVI9IiR7TFRMSUJaRV9MT0FERVJ9JHtMVExJQlpFX0xPQURFUjorIH0t bCRuYW1lIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBMSUJaRV9MT0FERVI9IiR7 TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisgfS1sOmxpYiRuYW1lLiRsaWJleHQiCisgICAg ICAgICAgICAgIExUTElCWkVfTE9BREVSPSIke0xUTElCWkVfTE9BREVSfSR7TFRMSUJaRV9MT0FE RVI6KyB9LWw6bGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkK KyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCisgIGlmIHRlc3QgIlgkcnBh dGhkaXJzIiAhPSAiWCI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3Nl cGFyYXRvciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbGRpcnM9CisgICAgICBm b3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisgICAgICAgIGFsbGRpcnM9IiR7YWxsZGly c30ke2FsbGRpcnM6KyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yfSRmb3VuZF9kaXIiCisgICAg ICBkb25lCisgICAgICAgICAgICBhY2xfc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICBsaWJk aXI9IiRhbGxkaXJzIgorICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3Nw ZWNcIgorICAgICAgbGliZGlyPSIkYWNsX3NhdmVfbGliZGlyIgorICAgICAgTElCWkVfTE9BREVS PSIke0xJQlpFX0xPQURFUn0ke0xJQlpFX0xPQURFUjorIH0kZmxhZyIKKyAgICBlbHNlCisgICAg ICAgICAgICBmb3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisgICAgICAgIGFjbF9zYXZl X2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgbGliZGlyPSIkZm91bmRfZGlyIgorICAgICAgICBl dmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICAgIGxpYmRpcj0i JGFjbF9zYXZlX2xpYmRpciIKKyAgICAgICAgTElCWkVfTE9BREVSPSIke0xJQlpFX0xPQURFUn0k e0xJQlpFX0xPQURFUjorIH0kZmxhZyIKKyAgICAgIGRvbmUKKyAgICBmaQorICBmaQorICBpZiB0 ZXN0ICJYJGx0cnBhdGhkaXJzIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgIGZvciBmb3VuZF9k aXIgaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgTFRMSUJaRV9MT0FERVI9IiR7TFRMSUJaRV9M T0FERVJ9JHtMVExJQlpFX0xPQURFUjorIH0tUiRmb3VuZF9kaXIiCisgICAgZG9uZQorICBmaQor CisKKyAgICAgICAgYWNfc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorCisgIGZvciBlbGVtZW50 IGluICRJTkNaRV9MT0FERVI7IGRvCisgICAgaGF2ZWl0PQorICAgIGZvciB4IGluICRDUFBGTEFH UzsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5h bF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNf cHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNf cHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZp eCIKKworICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGVsZW1lbnQiOyB0aGVuCisgICAgICAgIGhh dmVpdD15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGlmIHRlc3Qg LXogIiRoYXZlaXQiOyB0aGVuCisgICAgICBDUFBGTEFHUz0iJHtDUFBGTEFHU30ke0NQUEZMQUdT OisgfSRlbGVtZW50IgorICAgIGZpCisgIGRvbmUKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZTok e2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnplX2xvYWRlciIgPiY1CiskYXNf ZWNob19uICJjaGVja2luZyBmb3IgbGliemVfbG9hZGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2 X2xpYnplX2xvYWRlcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIg PiY2CitlbHNlCisKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRMSUJTICRM SUJaRV9MT0FERVIiCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFj X2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgImxldmVsX3plcm8vemV0X2Fw aS5oIgoraW50CittYWluICgpCit7Cit6ZUluaXQgKDApOworICA7CisgIHJldHVybiAwOworfQor X0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xp YnplX2xvYWRlcj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliemVfbG9hZGVyPW5vCitmaQorcm0gLWYg Y29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNf ZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQor eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9s aWJ6ZV9sb2FkZXIiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJ6ZV9sb2FkZXIiID4mNjsgfQor ICBpZiB0ZXN0ICIkYWNfY3ZfbGliemVfbG9hZGVyIiA9IHllczsgdGhlbgorICAgIEhBVkVfTElC WkVfTE9BREVSPXllcworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQlpFX0xPQURFUiAxIiA+ PmNvbmZkZWZzLmgKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P fTogY2hlY2tpbmcgaG93IHRvIGxpbmsgd2l0aCBsaWJ6ZV9sb2FkZXIiID4mNQorJGFzX2VjaG9f biAiY2hlY2tpbmcgaG93IHRvIGxpbmsgd2l0aCBsaWJ6ZV9sb2FkZXIuLi4gIiA+JjY7IH0KKyAg ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExJQlpF X0xPQURFUiIgPiY1CiskYXNfZWNobyAiJExJQlpFX0xPQURFUiIgPiY2OyB9CisgIGVsc2UKKyAg ICBIQVZFX0xJQlpFX0xPQURFUj1ubworICAgICAgICAgICAgQ1BQRkxBR1M9IiRhY19zYXZlX0NQ UEZMQUdTIgorICAgIExJQlpFX0xPQURFUj0KKyAgICBMVExJQlpFX0xPQURFUj0KKyAgZmkKKwor CisKKworCisKKworY2FzZSAiJHt0YXJnZXR9IiBpbgorICBpbnRlbGd0LSotemUpCisgICAgaWYg dGVzdCAiJEhBVkVfTElCWkVfTE9BREVSIiAhPSB5ZXM7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9y ICQ/ICJsaWJ6ZV9sb2FkZXIgaXMgbWlzc2luZyBvciB1bnVzYWJsZSIgIiRMSU5FTk8iIDUKKyAg ICBmaQorICAgIDs7CisgICopCisgICAgIyBEbyBub3QgbGluayBsaWJ6ZV9sb2FkZXIgc3B1cmlv dXNseQorICAgIEhBVkVfTElCWkVfTE9BREVSPW5vCisgICAgTElCWkVfTE9BREVSPQorICAgIExU TElCWkVfTE9BREVSPQorICAgIDs7Citlc2FjCisKKworCisKKworCisKKwogR05VTElCPS4uL2du dWxpYi9pbXBvcnQKIAogR05VTElCX1NURElOVF9IPQpkaWZmIC0tZ2l0IGEvZ2Ric2VydmVyL2Nv bmZpZ3VyZS5hYyBiL2dkYnNlcnZlci9jb25maWd1cmUuYWMKaW5kZXggNmUzYTczYTU4ZDUzYjFi ZDAwNWJkOGQ0NTJjMTE4YTA4MzU3NTJiNi4uZmQ5MGVhMDhjMjFlZDgxMmNlMzhjNGE5ZjNmMGI5 MzU5NmVlNjhjOCAxMDA2NDQKLS0tIGEvZ2Ric2VydmVyL2NvbmZpZ3VyZS5hYworKysgYi9nZGJz ZXJ2ZXIvY29uZmlndXJlLmFjCkBAIC00NTgsNiArNDU4LDI0IEBAIGlmICR3YW50X2lwYSA7IHRo ZW4KICAgIGZpCiBmaQogCitkbmwgY2hlY2sgZm9yIHRoZSB6ZSBsb2FkZXIKK0FDX0xJQl9IQVZF X0xJTktGTEFHUyhbemVfbG9hZGVyXSwgW10sIFsjaW5jbHVkZSAibGV2ZWxfemVyby96ZXRfYXBp LmgiXSwKKyAgW3plSW5pdCAoMCk7XSwpCisKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgaW50ZWxn dC0qLXplKQorICAgIGlmIHRlc3QgIiRIQVZFX0xJQlpFX0xPQURFUiIgIT0geWVzOyB0aGVuCisg ICAgICBBQ19NU0dfRVJST1IoW2xpYnplX2xvYWRlciBpcyBtaXNzaW5nIG9yIHVudXNhYmxlXSkK KyAgICBmaQorICAgIDs7CisgICopCisgICAgIyBEbyBub3QgbGluayBsaWJ6ZV9sb2FkZXIgc3B1 cmlvdXNseQorICAgIEhBVkVfTElCWkVfTE9BREVSPW5vCisgICAgTElCWkVfTE9BREVSPQorICAg IExUTElCWkVfTE9BREVSPQorICAgIDs7Citlc2FjCisKIEFDX1NVQlNUKEdEQlNFUlZFUl9ERVBG SUxFUykKIEFDX1NVQlNUKEdEQlNFUlZFUl9MSUJTKQogQUNfU1VCU1Qoc3J2X3htbGJ1aWx0aW4p CmRpZmYgLS1naXQgYS9nZGJzZXJ2ZXIvY29uZmlndXJlLnNydiBiL2dkYnNlcnZlci9jb25maWd1 cmUuc3J2CmluZGV4IGRiM2Y1NjMxYTQxN2QzNzA2ODI5Y2ZkODIwNmNjZjA4Yzg3MmE2YzEuLjk4 MzMwNTQwYzgyMTlkODE3NzY4ZmJkZDllMGI0MmVkNmY3OWVkNGYgMTAwNjQ0Ci0tLSBhL2dkYnNl cnZlci9jb25maWd1cmUuc3J2CisrKyBiL2dkYnNlcnZlci9jb25maWd1cmUuc3J2CkBAIC0xNDcs NiArMTQ3LDEwIEBAIGNhc2UgIiR7Z2Ric2VydmVyX2hvc3R9IiBpbgogCQkJc3J2X3RndG9iaj0i JHNydl9saW51eF9vYmogbGludXgtaWE2NC1sb3cubyIKIAkJCXNydl9saW51eF91c3JyZWdzPXll cwogCQkJOzsKKyAgaW50ZWxndC0qLXplKSAJc3J2X3JlZ29iaj0iIgorCQkJc3J2X3htbGZpbGVz PSIiCisJCQlzcnZfdGd0b2JqPSJ6ZS1sb3cubyBpbnRlbGd0LXplLWxvdy5vIGFyY2gvaW50ZWxn dC5vIgorCQkJOzsKICAgbG9vbmdhcmNoKi0qLWxpbnV4KikJc3J2X3RndG9iaj0iYXJjaC9sb29u Z2FyY2gubyBsaW51eC1sb29uZ2FyY2gtbG93Lm8iCiAJCQlzcnZfdGd0b2JqPSIke3Nydl90Z3Rv Ymp9ICR7c3J2X2xpbnV4X29ian0iCiAJCQlzcnZfbGludXhfcmVnc2V0cz15ZXMKZGlmZiAtLWdp dCBhL2dkYnNlcnZlci9nZGJ0aHJlYWQuaCBiL2dkYnNlcnZlci9nZGJ0aHJlYWQuaAppbmRleCBk N2I1YmMzZTE1MzhiZGU4ZWFmZDBmMzI1MzcwNjkyNGQ3MzMwYTIxLi5lMjNkNjBhZTFhZTk0NGRi ZTI1NjFmZmMzNWE4NWI4MDhkNjgxZGMwIDEwMDY0NAotLS0gYS9nZGJzZXJ2ZXIvZ2RidGhyZWFk LmgKKysrIGIvZ2Ric2VydmVyL2dkYnRocmVhZC5oCkBAIC00Niw3ICs0Niw3IEBAIHN0cnVjdCB0 aHJlYWRfaW5mbyA6IHB1YmxpYyBpbnRydXNpdmVfbGlzdF9ub2RlPHRocmVhZF9pbmZvPgogICB2 b2lkIHNldF9yZWdjYWNoZSAoc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSkKICAgeyBtX3JlZ2Nh Y2hlID0gcmVnY2FjaGU7IH0KIAotICB2b2lkICp0YXJnZXRfZGF0YSAoKQorICB2b2lkICp0YXJn ZXRfZGF0YSAoKSBjb25zdAogICB7IHJldHVybiBtX3RhcmdldF9kYXRhOyB9CiAKICAgLyogVGhl IGlkIG9mIHRoaXMgdGhyZWFkLiAgKi8KZGlmZiAtLWdpdCBhL2dkYnNlcnZlci9pbnRlbGd0LXpl LWxvdy5jYyBiL2dkYnNlcnZlci9pbnRlbGd0LXplLWxvdy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yN2VmZTY1 NjBlOTNkMWZmOTUzMWMxNDM3ZjU5ZTFmZTE2NDU5NjUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Ri c2VydmVyL2ludGVsZ3QtemUtbG93LmNjCkBAIC0wLDAgKzEsMTA0MSBAQAorLyogVGFyZ2V0IGlu dGVyZmFjZSBmb3IgSW50ZWwgR1QgYmFzZWQgb24gTGV2ZWwtWmVybyBmb3IgZ2Ric2VydmVyLgor CisgICBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu Yy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcg d2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uICAqLworCisjaW5jbHVkZSAiemUtbG93LmgiCisjaW5jbHVkZSAiYXJjaC9pbnRlbGd0 LmgiCisjaW5jbHVkZSAiZ2Ric3VwcG9ydC9vc2FiaS5oIgorCisjaW5jbHVkZSA8bGV2ZWxfemVy by96ZXRfaW50ZWxfZ3B1X2RlYnVnLmg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxz c3RyZWFtPgorCisKKy8qIEZJWE1FIG1ha2UgaW50byBhIHRhcmdldCBtZXRob2Q/ICAqLworaW50 IHVzaW5nX3RocmVhZHMgPSAxOworCisvKiBDb252ZW5pZW5jZSBtYWNyb3MuICAqLworCisjZGVm aW5lIGRwcmludGYoLi4uKQkJCQkJCVwKKyAgZG8JCQkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisg ICAgICBpZiAoZGVidWdfdGhyZWFkcykJCQkJCVwKKwl7CQkJCQkJCVwKKwkgIGRlYnVnX3ByaW50 ZiAoIiVzOiAiLCBfX0ZVTkNUSU9OX18pOwkJCVwKKwkgIGRlYnVnX3ByaW50ZiAoX19WQV9BUkdT X18pOwkJCQlcCisJICBkZWJ1Z19wcmludGYgKCJcbiIpOwkJCQkJXAorCX0JCQkJCQkJXAorICAg IH0JCQkJCQkJCVwKKyAgd2hpbGUgKDApCisKKworLyogRGV0ZXJtaW5lIHRoZSBtb3N0IHN1aXRh YmxlIHR5cGUgdG8gYmUgdXNlZCBmb3IgYSByZWdpc3RlciB3aXRoIGJpdCBzaXplCisgICBCSVRT SVpFIGFuZCBlbGVtZW50IHNpemUgRUxFTVNJWkUuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAq CitpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKHRkZXNjX2ZlYXR1cmUgKmZlYXR1cmUsIHVpbnQzMl90 IGJpdHNpemUsCisJCSAgICAgICB1aW50MzJfdCBlbGVtc2l6ZSkKK3sKKyAgaWYgKDAgIT0gKGJp dHNpemUgJSBlbGVtc2l6ZSkpCisgICAgZXJyb3IgKF8oInVuc3VwcG9ydGVkIGNvbWJpbmF0aW9u IG9mIGJpdHNpemUgJSIgUFJJdTMyICJhbmQgZWxlbXNpemUgJSIKKwkgICAgIFBSSXUzMiksIGJp dHNpemUsIGVsZW1zaXplKTsKKyAgaWYgKChlbGVtc2l6ZSA8IDgpIHx8IChlbGVtc2l6ZSA+IDEy OCkgfHwgKChlbGVtc2l6ZSAmIChlbGVtc2l6ZSAtIDEpKSAhPSAwKSkKKyAgICBlcnJvciAoXygi dW5zdXBwb3J0ZWQgZWxlbXNpemUgJSIgUFJJdTMyKSwgZWxlbXNpemUpOworCisgIGNoYXIgdHlw ZV9uYW1lWzIwXTsKKyAgc25wcmludGYgKHR5cGVfbmFtZSwgc2l6ZW9mICh0eXBlX25hbWUpLCAi dWludCV1IiwgZWxlbXNpemUpOworICB0ZGVzY190eXBlICp0eXBlID0gdGRlc2NfbmFtZWRfdHlw ZSAoZmVhdHVyZSwgdHlwZV9uYW1lKTsKKworICBpZiAoZWxlbXNpemUgPT0gYml0c2l6ZSkKKyAg ICByZXR1cm4gdHlwZS0+bmFtZS5jX3N0ciAoKTsKKworICB1aW50MzJfdCBlbGVtZW50cyA9IGJp dHNpemUgLyBlbGVtc2l6ZTsKKyAgc25wcmludGYgKHR5cGVfbmFtZSwgc2l6ZW9mICh0eXBlX25h bWUpLCAidmVjdG9yJXV4JXUiLCBlbGVtZW50cywKKwkgICAgZWxlbXNpemUpOworICB0ZGVzY190 eXBlICp2ZWN0b3IKKyAgICA9IHRkZXNjX2NyZWF0ZV92ZWN0b3IgKGZlYXR1cmUsIHR5cGVfbmFt ZSwgdHlwZSwgZWxlbWVudHMpOworCisgIHJldHVybiB2ZWN0b3ItPm5hbWUuY19zdHIgKCk7Cit9 CisKKy8qIEFkZCBhICh1bmlmb3JtKSByZWdpc3RlciBzZXQgdG8gRkVBVFVSRS4gICovCisKK3N0 YXRpYyB2b2lkCitpbnRlbGd0X2FkZF9yZWdzZXQgKHRkZXNjX2ZlYXR1cmUgKmZlYXR1cmUsIGxv bmcgJnJlZ251bSwKKwkJICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgdWludDMyX3QgY291bnQsIGNv bnN0IGNoYXIgKmdyb3VwLAorCQkgICAgdWludDMyX3QgYml0c2l6ZSwgY29uc3QgY2hhciAqdHlw ZSwgZXhwZWRpdGVfdCAmZXhwZWRpdGUpCit7CisgIGZvciAodWludDMyX3QgcmVnID0gMDsgcmVn IDwgY291bnQ7ICsrcmVnKQorICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnN0 cmluZyAocHJlZml4KSArIHN0ZDo6dG9fc3RyaW5nIChyZWcpOworCisgICAgICB0ZGVzY19jcmVh dGVfcmVnIChmZWF0dXJlLCBuYW1lLmNfc3RyICgpLCByZWdudW0rKywgMSwgZ3JvdXAsCisJCQli aXRzaXplLCB0eXBlKTsKKyAgICB9Cit9CisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgZGV0YWlscy4g ICovCisKK2VudW0KK3sKKyAgICAvKiBUaGUgcG9zaXRpb24gb2YgdGhlIEJyZWFrcG9pbnQgU3Vw cHJlc3MgYml0IGluIENSMC4wLiAgKi8KKyAgICBJTlRFTEdUX0NSMF8wX0JSRUFLUE9JTlRfU1VQ UFJFU1MgPSAxNSwKKworICAgIC8qIFRoZSBwb3NpdGlvbiBvZiB0aGUgQnJlYWtwb2ludCBTdGF0 dXMgYW5kIENvbnRyb2wgYml0IGluIENSMC4xLiAgKi8KKyAgICBJTlRFTEdUX0NSMF8xX0JSRUFL UE9JTlRfU1RBVFVTID0gMzEsCisKKyAgICAvKiBUaGUgcG9zaXRpb24gb2YgdGhlIEV4dGVybmFs IEhhbHQgU3RhdHVzIGFuZCBDb250cm9sIGJpdCBpbiBDUjAuMS4gICovCisgICAgSU5URUxHVF9D UjBfMV9FWFRFUk5BTF9IQUxUX1NUQVRVUyA9IDMwLAorCisgICAgLyogVGhlIHBvc2l0aW9uIG9m IHRoZSBTb2Z0d2FyZSBFeGNlcHRpb24gQ29udHJvbCBiaXQgaW4gQ1IwLjEuICAqLworICAgIElO VEVMR1RfQ1IwXzFfU09GVFdBUkVfRVhDRVBUSU9OX0NPTlRST0wgPSAyOSwKKworICAgIC8qIFRo ZSBwb3NpdGlvbiBvZiB0aGUgSWxsZWdhbCBPcGNvZGUgRXhjZXB0aW9uIFN0YXR1cyBiaXQgaW4g Q1IwLjEuICAqLworICAgIElOVEVMR1RfQ1IwXzFfSUxMRUdBTF9PUENPREVfU1RBVFVTID0gMjgs CisKKyAgICAvKiBUaGUgcG9zaXRpb24gb2YgdGhlIEZvcmNlIEV4Y2VwdGlvbiBTdGF0dXMgYW5k IENvbnRyb2wgYml0IGluIENSMC4xLiAgKi8KKyAgICBJTlRFTEdUX0NSMF8xX0ZPUkNFX0VYQ0VQ VElPTl9TVEFUVVMgPSAyNiwKKworICAgIC8qIFRoZSBwb3NpdGlvbiBvZiB0aGUgUGFnZSBGYXVs dCBTdGF0dXMgYml0IGluIENSMC4xLgorICAgICAgIFRoaXMgaXMgYSBzb2Z0d2FyZSBjb252ZW50 aW9uIHVzaW5nIGEgcmVzZXJ2ZWQgYml0IHRvIGluZGljYXRlCisgICAgICAgcGFnZSBmYXVsdHMg YnkgdGhlIHVzZXIgbW9kZSBkcml2ZXIuICAqLworICAgIElOVEVMR1RfQ1IwXzFfUEFHRUZBVUxU X1NUQVRVUyA9IDE2LAorfTsKKworLyogUmV0dXJuIENSMC5TVUJSRUcgaW4gUkVHQ0FDSEUuICAq LworCitzdGF0aWMgdWludDMyX3QKK2ludGVsZ3RfcmVhZF9jcjAgKHJlZ2NhY2hlICpyZWdjYWNo ZSwgaW50IHN1YnJlZykKK3sKKyAgaW50IGNyMHJlZ25vID0gZmluZF9yZWdubyAocmVnY2FjaGUt PnRkZXNjLCAiY3IwIik7CisgIGludCBjcjBzaXplID0gcmVnaXN0ZXJfc2l6ZSAocmVnY2FjaGUt PnRkZXNjLCBjcjByZWdubyk7CisgIHVpbnQzMl90IGNyMFsxNl07CisgIGdkYl9hc3NlcnQgKGNy MHNpemUgPD0gc2l6ZW9mIChjcjApKTsKKyAgZ2RiX2Fzc2VydCAoY3Iwc2l6ZSA+PSBzaXplb2Yg KGNyMFswXSkgKiAoc3VicmVnICsgMSkpOworICBjb2xsZWN0X3JlZ2lzdGVyIChyZWdjYWNoZSwg Y3IwcmVnbm8sIGNyMCk7CisKKyAgZW51bSByZWdpc3Rlcl9zdGF0dXMgY3Iwc3RhdHVzID0gcmVn Y2FjaGUtPmdldF9yZWdpc3Rlcl9zdGF0dXMgKGNyMHJlZ25vKTsKKyAgc3dpdGNoIChjcjBzdGF0 dXMpCisgICAgeworICAgIGNhc2UgUkVHX1ZBTElEOgorICAgICAgcmV0dXJuIGNyMFtzdWJyZWdd OworCisgICAgY2FzZSBSRUdfVU5LTk9XTjoKKyAgICAgIGludGVybmFsX2Vycm9yIChfKCJ1bmtu b3duIHJlZ2lzdGVyICdjcjAnLiIpKTsKKworICAgIGNhc2UgUkVHX1VOQVZBSUxBQkxFOgorICAg ICAgZXJyb3IgKF8oImNyMCBpcyBub3QgYXZhaWxhYmxlIikpOworICAgIH0KKworICBpbnRlcm5h bF9lcnJvciAoXygidW5rbm93biByZWdpc3RlciBzdGF0dXM6ICVkLiIpLCBjcjBzdGF0dXMpOwor fQorCisvKiBXcml0ZSBWQUxVRSBpbnRvIENSMC5TVUJSRUcgaW4gUkVHQ0FDSEUuICAqLworCitz dGF0aWMgdm9pZAoraW50ZWxndF93cml0ZV9jcjAgKHJlZ2NhY2hlICpyZWdjYWNoZSwgaW50IHN1 YnJlZywgdWludDMyX3QgdmFsdWUpCit7CisgIGludCBjcjByZWdubyA9IGZpbmRfcmVnbm8gKHJl Z2NhY2hlLT50ZGVzYywgImNyMCIpOworICBpbnQgY3Iwc2l6ZSA9IHJlZ2lzdGVyX3NpemUgKHJl Z2NhY2hlLT50ZGVzYywgY3IwcmVnbm8pOworICB1aW50MzJfdCBjcjBbMTZdOworICBnZGJfYXNz ZXJ0IChjcjBzaXplIDw9IHNpemVvZiAoY3IwKSk7CisgIGdkYl9hc3NlcnQgKGNyMHNpemUgPj0g c2l6ZW9mIChjcjBbMF0pICogKHN1YnJlZyArIDEpKTsKKyAgY29sbGVjdF9yZWdpc3RlciAocmVn Y2FjaGUsIGNyMHJlZ25vLCBjcjApOworCisgIGVudW0gcmVnaXN0ZXJfc3RhdHVzIGNyMHN0YXR1 cyA9IHJlZ2NhY2hlLT5nZXRfcmVnaXN0ZXJfc3RhdHVzIChjcjByZWdubyk7CisgIHN3aXRjaCAo Y3Iwc3RhdHVzKQorICAgIHsKKyAgICBjYXNlIFJFR19WQUxJRDoKKyAgICAgIGNyMFtzdWJyZWdd ID0gdmFsdWU7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2NhY2hlLCBjcjByZWdubywgY3Iw KTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgUkVHX1VOS05PV046CisgICAgICBpbnRlcm5h bF9lcnJvciAoXygidW5rbm93biByZWdpc3RlciAnY3IwJy4iKSk7CisKKyAgICBjYXNlIFJFR19V TkFWQUlMQUJMRToKKyAgICAgIGVycm9yIChfKCJjcjAgaXMgbm90IGF2YWlsYWJsZSIpKTsKKyAg ICB9CisKKyAgaW50ZXJuYWxfZXJyb3IgKF8oInVua25vd24gcmVnaXN0ZXIgc3RhdHVzOiAlZC4i KSwgY3Iwc3RhdHVzKTsKK30KKworLyogUmV0dXJuIENSMC5TVUJSRUcgZm9yIFRQLiAgKi8KKwor c3RhdGljIHVpbnQzMl90CitpbnRlbGd0X3JlYWRfY3IwICh0aHJlYWRfaW5mbyAqdHAsIGludCBz dWJyZWcpCit7CisgIHN0cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUgPSBnZXRfdGhyZWFkX3JlZ2Nh Y2hlICh0cCwgLyogZmV0Y2ggPSAqLyB0cnVlKTsKKyAgcmV0dXJuIGludGVsZ3RfcmVhZF9jcjAg KHJlZ2NhY2hlLCBzdWJyZWcpOworfQorCisvKiBXcml0ZSBWQUxVRSBpbnRvIENSMC5TVUJSRUcg Zm9yIFRQLiAgKi8KKworc3RhdGljIHZvaWQKK2ludGVsZ3Rfd3JpdGVfY3IwICh0aHJlYWRfaW5m byAqdHAsIGludCBzdWJyZWcsIHVpbnQzMl90IHZhbHVlKQoreworICBzdHJ1Y3QgcmVnY2FjaGUg KnJlZ2NhY2hlID0gZ2V0X3RocmVhZF9yZWdjYWNoZSAodHAsIC8qIGZldGNoID0gKi8gdHJ1ZSk7 CisgIGludGVsZ3Rfd3JpdGVfY3IwIChyZWdjYWNoZSwgc3VicmVnLCB2YWx1ZSk7Cit9CisKKy8q IFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIGRldmljZSBVVUlEIHN0cmluZy4gICovCisKK3N0YXRp YyBzdGQ6OnN0cmluZworZGV2aWNlX3V1aWRfc3RyIChjb25zdCB1aW50OF90IHV1aWRbXSwgc2l6 ZV90IHNpemUpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07CisgIGZvciAoaW50IGkg PSBzaXplIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgc3N0cmVhbSA8PCBzdGQ6OmhleCA8PCBzdGQ6 OnNldGZpbGwgKCcwJykgPDwgc3RkOjpzZXR3ICgyKQorCSAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+ ICh1dWlkW2ldKTsKKworICByZXR1cm4gc3N0cmVhbS5zdHIgKCk7Cit9CisKKy8qIFRhcmdldCBv cCBkZWZpbml0aW9ucyBmb3IgSW50ZWwgR1QgdGFyZ2V0IGJhc2VkIG9uIExldmVsLVplcm8uICAq LworCitjbGFzcyBpbnRlbGd0X3plX3RhcmdldCA6IHB1YmxpYyB6ZV90YXJnZXQKK3sKK3B1Ymxp YzoKKyAgY29uc3QgZ2RiX2J5dGUgKnN3X2JyZWFrcG9pbnRfZnJvbV9raW5kIChpbnQga2luZCwg aW50ICpzaXplKSBvdmVycmlkZTsKKworICBib29sIHN1cHBvcnRzX3N0b3BwZWRfYnlfc3dfYnJl YWtwb2ludCAoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgc3RvcHBlZF9ieV9z d19icmVha3BvaW50ICgpIG92ZXJyaWRlOworCisgIENPUkVfQUREUiByZWFkX3BjIChyZWdjYWNo ZSAqcmVnY2FjaGUpIG92ZXJyaWRlOworICB2b2lkIHdyaXRlX3BjIChyZWdjYWNoZSAqcmVnY2Fj aGUsIENPUkVfQUREUiBwYykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBpc19kZXZp Y2Vfc3VwcG9ydGVkCisgICAgKGNvbnN0IHplX2RldmljZV9wcm9wZXJ0aWVzX3QgJiwKKyAgICAg Y29uc3Qgc3RkOjp2ZWN0b3I8emV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVzX3Q+ICYpIG92ZXJy aWRlOworCisgIHRhcmdldF9kZXNjICpjcmVhdGVfdGRlc2MKKyAgICAoemVfZGV2aWNlX2luZm8g KmRpbmZvLAorICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx6ZXRfZGVidWdfcmVnc2V0X3Byb3BlcnRp ZXNfdD4gJiwKKyAgICAgY29uc3QgemVfcGNpX2V4dF9wcm9wZXJ0aWVzX3QgJikgb3ZlcnJpZGU7 CisKKyAgdGFyZ2V0X3N0b3BfcmVhc29uIGdldF9zdG9wX3JlYXNvbiAodGhyZWFkX2luZm8gKiwg Z2RiX3NpZ25hbCAmKSBvdmVycmlkZTsKKworICB2b2lkIHByZXBhcmVfdGhyZWFkX3Jlc3VtZSAo dGhyZWFkX2luZm8gKnRwKSBvdmVycmlkZTsKKworICAvKiBSZWFkIG9uZSBpbnN0cnVjdGlvbiBm cm9tIG1lbW9yeSBhdCBQQyBpbnRvIEJVRkZFUiBhbmQgcmV0dXJuIHRoZQorICAgICBudW1iZXIg b2YgYnl0ZXMgcmVhZCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gZXJyb3IgY29kZS4K KworICAgICBCVUZGRVIgbXVzdCBiZSBpbnRlbGd0OjpNQVhfSU5TVF9MRU5HVEggYnl0ZXMgbG9u Zy4gICovCisgIGludCByZWFkX2luc3QgKHRocmVhZF9pbmZvICp0cCwgQ09SRV9BRERSIHBjLAor CQkgZ2RiOjphcnJheV92aWV3PGdkYl9ieXRlPiBidWZmZXIpOworCisgIGJvb2wgaXNfYXRfYnJl YWtwb2ludCAodGhyZWFkX2luZm8gKnRwKSBvdmVycmlkZTsKKyAgYm9vbCBpc19hdF9lb3QgKHRo cmVhZF9pbmZvICp0cCk7CisKKyAgYm9vbCBlcnJhdHVtXzE4MDIwMzU1ODEzICh0aHJlYWRfaW5m byAqdHApOworCitwcml2YXRlOgorICAvKiBBZGQgYSByZWdpc3RlciBzZXQgZm9yIFJFR1BST1Ag b24gREVWSUNFIHRvIFJFR1NFVFMgYW5kIGluY3JlbWVudCBSRUdOVU0KKyAgICAgYWNjb3JkaW5n bHkuCisKKyAgICAgTWF5IG9wdGlvbmFsbHkgYWRkIHJlZ2lzdGVycyB0byBFWFBFRElURS4gICov CisgIHZvaWQgYWRkX3JlZ3NldCAodGFyZ2V0X2Rlc2MgKnRkZXNjLCBjb25zdCB6ZV9kZXZpY2Vf cHJvcGVydGllc190ICZkZXZpY2UsCisJCSAgIGNvbnN0IHpldF9kZWJ1Z19yZWdzZXRfcHJvcGVy dGllc190ICZyZWdwcm9wLAorCQkgICBsb25nICZyZWdudW0sIHplX3JlZ3NldF9pbmZvX3QgJnJl Z3NldHMsCisJCSAgIGV4cGVkaXRlX3QgJmV4cGVkaXRlKTsKK307CisKK2NvbnN0IGdkYl9ieXRl ICoKK2ludGVsZ3RfemVfdGFyZ2V0Ojpzd19icmVha3BvaW50X2Zyb21fa2luZCAoaW50IGtpbmQs IGludCAqc2l6ZSkKK3sKKyAgLyogV2UgZG8gbm90IHN1cHBvcnQgYnJlYWtwb2ludCBpbnN0cnVj dGlvbnMuCisKKyAgICAgVXNlIGdkYmFyY2ggbWV0aG9kcyB0aGF0IHVzZSByZWFkL3dyaXRlIG1l bW9yeSB0YXJnZXQgb3BlcmF0aW9ucyBmb3IKKyAgICAgc2V0dGluZyBzL3cgYnJlYWtvcGludHMu ICAqLworICAqc2l6ZSA9IDA7CisgIHJldHVybiBudWxscHRyOworfQorCitib29sCitpbnRlbGd0 X3plX3RhcmdldDo6c3RvcHBlZF9ieV9zd19icmVha3BvaW50ICgpCit7CisgIGNvbnN0IHplX3Ro cmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFkIChjdXJyZW50X3RocmVhZCk7CisgIGlmICh6ZXRw ID09IG51bGxwdHIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHB0aWRfdCBwdGlkID0gY3VycmVu dF90aHJlYWQtPmlkOworCisgIGlmICh6ZXRwLT5leGVjX3N0YXRlICE9IFpFX1RIUkVBRF9TVEFU RV9TVE9QUEVEKQorICAgIHsKKyAgICAgIGRwcmludGYgKCJub3Qtc3RvcHBlZCB0aHJlYWQgJXMi LCBwdGlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg fQorCisgIHJldHVybiAoemV0cC0+c3RvcF9yZWFzb24gPT0gVEFSR0VUX1NUT1BQRURfQllfU1df QlJFQUtQT0lOVCk7Cit9CisKK0NPUkVfQUREUgoraW50ZWxndF96ZV90YXJnZXQ6OnJlYWRfcGMg KHJlZ2NhY2hlICpyZWdjYWNoZSkKK3sKKyAgdWludDMyX3QgaXAgPSBpbnRlbGd0X3JlYWRfY3Iw IChyZWdjYWNoZSwgMik7CisgIHVpbnQ2NF90IGlzYWJhc2U7CisgIGNvbGxlY3RfcmVnaXN0ZXJf YnlfbmFtZSAocmVnY2FjaGUsICJpc2FiYXNlIiwgJmlzYWJhc2UpOworCisgIGlmIChVSU5UMzJf TUFYIDwgaXApCisgICAgd2FybmluZyAoXygiSVAgJzB4JSIgUFJJeDMyICInIG91dHNpZGUgb2Yg SVNBIHJhbmdlLiIpLCBpcCk7CisKKyAgQ09SRV9BRERSIHBjID0gKENPUkVfQUREUikgaXNhYmFz ZSArIChDT1JFX0FERFIpIGlwOworICBpZiAocGMgPCBpc2FiYXNlKQorICAgIHdhcm5pbmcgKF8o IlBDICclcycgb3V0c2lkZSBvZiBJU0EgcmFuZ2UuIiksCisJICAgICBjb3JlX2FkZHJfdG9fc3Ry aW5nX256IChwYykpOworCisgIHJldHVybiBwYzsKK30KKwordm9pZAoraW50ZWxndF96ZV90YXJn ZXQ6OndyaXRlX3BjIChyZWdjYWNoZSAqcmVnY2FjaGUsIENPUkVfQUREUiBwYykKK3sKKyAgdWlu dDY0X3QgaXNhYmFzZTsKKyAgY29sbGVjdF9yZWdpc3Rlcl9ieV9uYW1lIChyZWdjYWNoZSwgImlz YWJhc2UiLCAmaXNhYmFzZSk7CisKKyAgaWYgKHBjIDwgaXNhYmFzZSkKKyAgICBlcnJvciAoXygi UEMgJyVzJyBvdXRzaWRlIG9mIElTQSByYW5nZS4iKSwgY29yZV9hZGRyX3RvX3N0cmluZ19ueiAo cGMpKTsKKworICBwYyAtPSBpc2FiYXNlOworICBpZiAoVUlOVDMyX01BWCA8IHBjKQorICAgIGVy cm9yIChfKCJQQyAnJXMnIG91dHNpZGUgb2YgSVNBIHJhbmdlLiIpLCBjb3JlX2FkZHJfdG9fc3Ry aW5nX256IChwYykpOworCisgIGludGVsZ3Rfd3JpdGVfY3IwIChyZWdjYWNoZSwgMiwgKHVpbnQz Ml90KSBwYyk7Cit9CisKK2Jvb2wKK2ludGVsZ3RfemVfdGFyZ2V0Ojppc19kZXZpY2Vfc3VwcG9y dGVkCisgIChjb25zdCB6ZV9kZXZpY2VfcHJvcGVydGllc190ICZwcm9wZXJ0aWVzLAorICAgY29u c3Qgc3RkOjp2ZWN0b3I8emV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVzX3Q+ICZyZWdzZXRfcHJv cGVydGllcykKK3sKKyAgaWYgKHByb3BlcnRpZXMudHlwZSAhPSBaRV9ERVZJQ0VfVFlQRV9HUFUp CisgICAgeworICAgICAgZHByaW50ZiAoIm5vbi1ncHUgKCV4KSBkZXZpY2UgKCUiIFBSSXgzMiAi KTogJXMiLCBwcm9wZXJ0aWVzLnR5cGUsCisJICAgICAgIHByb3BlcnRpZXMuZGV2aWNlSWQsIHBy b3BlcnRpZXMubmFtZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChwcm9w ZXJ0aWVzLnZlbmRvcklkICE9IDB4ODA4NikKKyAgICB7CisgICAgICBkcHJpbnRmICgidW5rbm93 biB2ZW5kb3IgKCUiIFBSSXgzMiAiKSBvZiBkZXZpY2UgKCUiIFBSSXgzMiAiKTogJXMiLAorCSAg ICAgICBwcm9wZXJ0aWVzLnZlbmRvcklkLCBwcm9wZXJ0aWVzLmRldmljZUlkLCBwcm9wZXJ0aWVz Lm5hbWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBXZSBuZWVkIGEgZmV3 IHJlZ2lzdGVycyB0byBzdXBwb3J0IGFuIEludGVsIEdUIGRldmljZS4KKworICAgICBUaG9zZSBh cmUgcmVnaXN0ZXJzIHRoYXQgR0RCIGl0c2VsZiB1c2VzLiAgV2l0aG91dCB0aG9zZSwgd2UgbWln aHQgcnVuIGludG8KKyAgICAgaW50ZXJuYWwgZXJyb3JzIGF0IHNvbWUgcG9pbnQuICBXZSBuZWVk IG90aGVycywgdG9vLCB0aGF0IG1heSBiZSByZWZlcmVuY2VkCisgICAgIGluIGRlYnVnIGluZm9y bWF0aW9uLiAgKi8KKyAgYm9vbCBoYXZlX2dyZiA9IGZhbHNlOworICBib29sIGhhdmVfaXNhYmFz ZSA9IGZhbHNlOworICBib29sIGhhdmVfY3IgPSBmYWxzZTsKKyAgYm9vbCBoYXZlX3NyID0gZmFs c2U7CisgIGJvb2wgaGF2ZV9jZSA9IGZhbHNlOworICBmb3IgKGNvbnN0IHpldF9kZWJ1Z19yZWdz ZXRfcHJvcGVydGllc190ICZyZWdwcm9wIDogcmVnc2V0X3Byb3BlcnRpZXMpCisgICAgeworICAg ICAgaWYgKHJlZ3Byb3AuY291bnQgPCAxKQorCXsKKwkgIHdhcm5pbmcgKF8oIklnbm9yaW5nIGVt cHR5IHJlZ3NldCAldSBpbiAlcy4iKSwgcmVncHJvcC50eXBlLAorCQkgICBwcm9wZXJ0aWVzLm5h bWUpOworCSAgY29udGludWU7CisJfQorCisgICAgICBzd2l0Y2ggKHJlZ3Byb3AudHlwZSkKKwl7 CisJY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfR1JGX0lOVEVMX0dQVToKKwkgIGhhdmVfZ3Jm ID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfQ0VfSU5U RUxfR1BVOgorCSAgaGF2ZV9jZSA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgWkVUX0RFQlVH X1JFR1NFVF9UWVBFX0NSX0lOVEVMX0dQVToKKwkgIGhhdmVfY3IgPSB0cnVlOworCSAgYnJlYWs7 CisKKwljYXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9TUl9JTlRFTF9HUFU6CisJICBoYXZlX3Ny ID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfU0JBX0lO VEVMX0dQVToKKwkgIC8qIFdlIG5lZWQgJ2lzYWJhc2UnLCB3aGljaCBpcyBhdCBwb3NpdGlvbiA1 IGluIHZlcnNpb24gMS4gICovCisJICBpZiAoKHJlZ3Byb3AudmVyc2lvbiA9PSAwKSAmJiAocmVn cHJvcC5jb3VudCA+PSA1KSkKKwkgICAgaGF2ZV9pc2FiYXNlID0gdHJ1ZTsKKwkgIGVsc2UKKwkg ICAgd2FybmluZyAoXygiSWdub3JpbmcgdW5rbm93biBTQkEgcmVnc2V0IHZlcnNpb24gJXUgaW4g JXMuIiksCisJCSAgICAgcmVncHJvcC52ZXJzaW9uLCBwcm9wZXJ0aWVzLm5hbWUpOworCSAgYnJl YWs7CisJfQorICAgIH0KKworICBpZiAoaGF2ZV9ncmYgJiYgaGF2ZV9pc2FiYXNlICYmIGhhdmVf Y3IgJiYgaGF2ZV9zciAmJiBoYXZlX2NlKQorICAgIHJldHVybiB0cnVlOworCisgIGRwcmludGYg KCJ1bnN1cHBvcnRlZCBkZXZpY2UgKCUiIFBSSXgzMiAiKTogJXMiLCBwcm9wZXJ0aWVzLmRldmlj ZUlkLAorCSAgIHByb3BlcnRpZXMubmFtZSk7CisgIHJldHVybiBmYWxzZTsKK30KKwordGFyZ2V0 X2Rlc2MgKgoraW50ZWxndF96ZV90YXJnZXQ6OmNyZWF0ZV90ZGVzYworICAoemVfZGV2aWNlX2lu Zm8gKmRpbmZvLAorICAgY29uc3Qgc3RkOjp2ZWN0b3I8emV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0 aWVzX3Q+ICZyZWdzZXRfcHJvcGVydGllcywKKyAgIGNvbnN0IHplX3BjaV9leHRfcHJvcGVydGll c190ICZwY2lfcHJvcGVydGllcykKK3sKKyAgY29uc3QgemVfZGV2aWNlX3Byb3BlcnRpZXNfdCAm cHJvcGVydGllcyA9IGRpbmZvLT5wcm9wZXJ0aWVzOworCisgIGlmIChwcm9wZXJ0aWVzLnZlbmRv cklkICE9IDB4ODA4NikKKyAgICBlcnJvciAoXygidW5rbm93biB2ZW5kb3IgKCUiIFBSSXgzMiAi KSBvZiBkZXZpY2UgKCUiIFBSSXgzMiAiKTogJXMiKSwKKwkgICBwcm9wZXJ0aWVzLnZlbmRvcklk LCBwcm9wZXJ0aWVzLmRldmljZUlkLCBwcm9wZXJ0aWVzLm5hbWUpOworCisgIHRhcmdldF9kZXNj X3VwIHRkZXNjID0gYWxsb2NhdGVfdGFyZ2V0X2Rlc2NyaXB0aW9uICgpOworICBzZXRfdGRlc2Nf YXJjaGl0ZWN0dXJlICh0ZGVzYy5nZXQgKCksICJpbnRlbGd0Iik7CisgIHNldF90ZGVzY19vc2Fi aSAodGRlc2MuZ2V0ICgpLCBHREJfT1NBQklfTElOVVgpOworCisgIHN0ZDo6c3RyaW5nIGRldmlj ZV91dWlkID0gZGV2aWNlX3V1aWRfc3RyICgKKyAgICBkaW5mby0+cHJvcGVydGllcy51dWlkLmlk LCBzaXplb2YgKGRpbmZvLT5wcm9wZXJ0aWVzLnV1aWQuaWQpKTsKKyAgY29uc3QgdWludDMyX3Qg dG90YWxfY29yZXMgPSAocHJvcGVydGllcy5udW1TbGljZXMKKwkJCQkqIHByb3BlcnRpZXMubnVt U3Vic2xpY2VzUGVyU2xpY2UKKwkJCQkqIHByb3BlcnRpZXMubnVtRVVzUGVyU3Vic2xpY2UpOwor ICBjb25zdCB1aW50MzJfdCB0b3RhbF90aHJlYWRzID0gKHRvdGFsX2NvcmVzICogcHJvcGVydGll cy5udW1UaHJlYWRzUGVyRVUpOworCisgIHRkZXNjX2RldmljZSAqZGV2aWNlX2luZm8gPSBuZXcg dGRlc2NfZGV2aWNlICgpOworICBkZXZpY2VfaW5mby0+dmVuZG9yX2lkID0gcHJvcGVydGllcy52 ZW5kb3JJZDsKKyAgZGV2aWNlX2luZm8tPnRhcmdldF9pZCA9IHByb3BlcnRpZXMuZGV2aWNlSWQ7 CisgIGRldmljZV9pbmZvLT5uYW1lID0gcHJvcGVydGllcy5uYW1lOworICBkZXZpY2VfaW5mby0+ cGNpX3Nsb3QgPSBzdHJpbmdfcHJpbnRmICgiJTAyIiBQUkl4MzIgIjolMDIiIFBSSXgzMgorCQkJ CQkgIi4lIiBQUklkMzIsCisJCQkJCSBwY2lfcHJvcGVydGllcy5hZGRyZXNzLmJ1cywKKwkJCQkJ IHBjaV9wcm9wZXJ0aWVzLmFkZHJlc3MuZGV2aWNlLAorCQkJCQkgcGNpX3Byb3BlcnRpZXMuYWRk cmVzcy5mdW5jdGlvbik7CisgIGRldmljZV9pbmZvLT51dWlkID0gZGV2aWNlX3V1aWQ7CisgIGRl dmljZV9pbmZvLT50b3RhbF9jb3JlcyA9IHRvdGFsX2NvcmVzOworICBkZXZpY2VfaW5mby0+dG90 YWxfdGhyZWFkcyA9IHRvdGFsX3RocmVhZHM7CisKKyAgaWYgKHByb3BlcnRpZXMuZmxhZ3MgJiBa RV9ERVZJQ0VfUFJPUEVSVFlfRkxBR19TVUJERVZJQ0UpCisgICAgZGV2aWNlX2luZm8tPnN1YmRl dmljZV9pZCA9IHByb3BlcnRpZXMuc3ViZGV2aWNlSWQ7CisKKyAgc2V0X3RkZXNjX2RldmljZV9p bmZvICh0ZGVzYy5nZXQgKCksIGRldmljZV9pbmZvKTsKKworICBsb25nIHJlZ251bSA9IDA7Cisg IGZvciAoY29uc3QgemV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVzX3QgJnJlZ3Byb3AgOiByZWdz ZXRfcHJvcGVydGllcykKKyAgICBhZGRfcmVnc2V0ICh0ZGVzYy5nZXQgKCksIHByb3BlcnRpZXMs IHJlZ3Byb3AsIHJlZ251bSwKKwkJZGluZm8tPnJlZ3NldHMsIGRpbmZvLT5leHBlZGl0ZSk7CisK KyAgLyogVGRlc2MgZXhwZWN0cyBhIG51bGxwdHItdGVybWluYXRlZCBhcnJheS4gICovCisgIGRp bmZvLT5leHBlZGl0ZS5wdXNoX2JhY2sgKG51bGxwdHIpOworCisgIGluaXRfdGFyZ2V0X2Rlc2Mg KHRkZXNjLmdldCAoKSwgZGluZm8tPmV4cGVkaXRlLmRhdGEgKCksIEdEQl9PU0FCSV9MSU5VWCk7 CisgIHJldHVybiB0ZGVzYy5yZWxlYXNlICgpOworfQorCit0YXJnZXRfc3RvcF9yZWFzb24KK2lu dGVsZ3RfemVfdGFyZ2V0OjpnZXRfc3RvcF9yZWFzb24gKHRocmVhZF9pbmZvICp0cCwgZ2RiX3Np Z25hbCAmc2lnbmFsKQoreworICB6ZV9kZXZpY2VfdGhyZWFkX3QgdGhyZWFkID0gemVfdGhyZWFk X2lkICh0cCk7CisgIHVpbnQzMl90IGNyMFszXSA9IHsKKyAgICBpbnRlbGd0X3JlYWRfY3IwICh0 cCwgMCksCisgICAgaW50ZWxndF9yZWFkX2NyMCAodHAsIDEpLAorICAgIGludGVsZ3RfcmVhZF9j cjAgKHRwLCAyKQorICB9OworCisgIGRwcmludGYgKCJ0aHJlYWQgJXMgKCVzKSBzdG9wcGVkLCBj cjAuMD0lIiBQUkl4MzIgIiwgLjE9JSIgUFJJeDMyCisJICAgIiBbICVzJXMlcyVzJXMlc10sIC4y PSUiIFBSSXgzMiAiLiIsIHRwLT5pZC50b19zdHJpbmcgKCkuY19zdHIgKCksCisJICAgemVfdGhy ZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgY3IwWzBdLCBjcjBbMV0sCisJICAgKCgoY3Iw WzFdICYgKDEgPDwgSU5URUxHVF9DUjBfMV9CUkVBS1BPSU5UX1NUQVRVUykpICE9IDApCisJICAg ID8gImJwICIgOiAiIiksCisJICAgKCgoY3IwWzFdICYgKDEgPDwgSU5URUxHVF9DUjBfMV9JTExF R0FMX09QQ09ERV9TVEFUVVMpKSAhPSAwKQorCSAgICA/ICJpbGwgIiA6ICIiKSwKKwkgICAoKChj cjBbMV0gJiAoMSA8PCBJTlRFTEdUX0NSMF8xX0ZPUkNFX0VYQ0VQVElPTl9TVEFUVVMpKSAhPSAw KQorCSAgICA/ICJmZSAiIDogIiIpLAorCSAgICgoKGNyMFsxXSAmICgxIDw8IElOVEVMR1RfQ1Iw XzFfU09GVFdBUkVfRVhDRVBUSU9OX0NPTlRST0wpKSAhPSAwKQorCSAgICA/ICJzdyAiIDogIiIp LAorCSAgICgoKGNyMFsxXSAmICgxIDw8IElOVEVMR1RfQ1IwXzFfRVhURVJOQUxfSEFMVF9TVEFU VVMpKSAhPSAwKQorCSAgICA/ICJlaCAiIDogIiIpLAorCSAgICgoKGNyMFsxXSAmICgxIDw8IElO VEVMR1RfQ1IwXzFfUEFHRUZBVUxUX1NUQVRVUykpICE9IDApCisJICAgID8gInBmICIgOiAiIiks CisJICAgY3IwWzJdKTsKKworICBpZiAoKGNyMFsxXSAmICgxIDw8IElOVEVMR1RfQ1IwXzFfUEFH RUZBVUxUX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgY3IwWzFdICY9IH4oMSA8PCBJTlRF TEdUX0NSMF8xX1BBR0VGQVVMVF9TVEFUVVMpOworICAgICAgaW50ZWxndF93cml0ZV9jcjAgKHRw LCAxLCBjcjBbMV0pOworCisgICAgICBzaWduYWwgPSBHREJfU0lHTkFMX1NFR1Y7CisgICAgICBy ZXR1cm4gVEFSR0VUX1NUT1BQRURfQllfTk9fUkVBU09OOworICAgIH0KKworICBpZiAoKGNyMFsx XSAmICgxIDw8IElOVEVMR1RfQ1IwXzFfQlJFQUtQT0lOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsK KyAgICAgIGNyMFsxXSAmPSB+KDEgPDwgSU5URUxHVF9DUjBfMV9CUkVBS1BPSU5UX1NUQVRVUyk7 CisgICAgICBpbnRlbGd0X3dyaXRlX2NyMCAodHAsIDEsIGNyMFsxXSk7CisKKyAgICAgIC8qIFdl IGNhbm5vdCBkaXN0aW5ndWlzaCBhIHNpbmdsZSBzdGVwIGV4Y2VwdGlvbiBmcm9tIGEgYnJlYWtw b2ludAorCSBleGNlcHRpb24ganVzdCBieSBsb29raW5nIGF0IENSMC4KKworCSBXZSBjb3VsZCBp bnNwZWN0IHRoZSBpbnN0cnVjdGlvbiB0byBzZWUgaWYgdGhlIGJyZWFrcG9pbnQgYml0IGlzCisJ IHNldC4gIE9yIHdlIGNvdWxkIGNoZWNrIHRoZSByZXN1bWUgdHlwZSBhbmQgYXNzdW1lIHRoYXQg d2Ugc2V0CisJIHRoaW5ncyB1cCBjb3JyZWN0bHkgZm9yIHNpbmdsZS1zdGVwcGluZyBiZWZvcmUg d2UgcmVzdW1lZC4gICovCisgICAgICBjb25zdCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3Ro cmVhZCAodHApOworICAgICAgZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICAgICAg c3dpdGNoICh6ZXRwLT5yZXN1bWVfc3RhdGUpCisJeworCWNhc2UgWkVfVEhSRUFEX1JFU1VNRV9T VEVQOgorCSAgc2lnbmFsID0gR0RCX1NJR05BTF9UUkFQOworCSAgcmV0dXJuIFRBUkdFVF9TVE9Q UEVEX0JZX1NJTkdMRV9TVEVQOworCisJY2FzZSBaRV9USFJFQURfUkVTVU1FX1JVTjoKKwljYXNl IFpFX1RIUkVBRF9SRVNVTUVfTk9ORToKKwkgIC8qIE9uIHNvbWUgZGV2aWNlcywgd2UgbWF5IGdl dCBzcHVyaW91cyBicmVha3BvaW50IGV4Y2VwdGlvbnMuICAqLworCSAgaWYgKGVycmF0dW1fMTgw MjAzNTU4MTMgKHRwKSkKKwkgICAgeworCSAgICAgIHplX2RldmljZV90aHJlYWRfdCB6ZWlkID0g emVfdGhyZWFkX2lkICh0cCk7CisKKwkgICAgICBkcHJpbnRmICgiYXBwbHlpbmcgIzE4MDIwMzU1 ODEzIHdvcmthcm91bmQgZm9yIHRocmVhZCAiCisJCSAgICAgICAiJXMgKCVzKSIsIHRwLT5pZC50 b19zdHJpbmcgKCkuY19zdHIgKCksCisJCSAgICAgICB6ZV90aHJlYWRfaWRfc3RyICh6ZWlkKS5j X3N0ciAoKSk7CisKKwkgICAgICBzaWduYWwgPSBHREJfU0lHTkFMXzA7CisJICAgICAgcmV0dXJu IFRBUkdFVF9TVE9QUEVEX0JZX05PX1JFQVNPTjsKKwkgICAgfQorCisJICBbW2ZhbGx0aHJvdWdo XV07CisJY2FzZSBaRV9USFJFQURfUkVTVU1FX1NUT1A6CisJICBzaWduYWwgPSBHREJfU0lHTkFM X1RSQVA7CisJICByZXR1cm4gVEFSR0VUX1NUT1BQRURfQllfU1dfQlJFQUtQT0lOVDsKKwl9Cisg ICAgfQorCisgIGlmICgoY3IwWzFdICYgKDEgPDwgSU5URUxHVF9DUjBfMV9JTExFR0FMX09QQ09E RV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgIGNyMFsxXSAmPSB+KDEgPDwgSU5URUxHVF9D UjBfMV9JTExFR0FMX09QQ09ERV9TVEFUVVMpOworICAgICAgaW50ZWxndF93cml0ZV9jcjAgKHRw LCAxLCBjcjBbMV0pOworCisgICAgICBzaWduYWwgPSBHREJfU0lHTkFMX0lMTDsKKyAgICAgIHJl dHVybiBUQVJHRVRfU1RPUFBFRF9CWV9OT19SRUFTT047CisgICAgfQorCisgIGlmICgoY3IwWzFd ICYgKDEgPDwgSU5URUxHVF9DUjBfMV9TT0ZUV0FSRV9FWENFUFRJT05fQ09OVFJPTCkpICE9IDAp CisgICAgeworICAgICAgY3IwWzFdICY9IH4oMSA8PCBJTlRFTEdUX0NSMF8xX1NPRlRXQVJFX0VY Q0VQVElPTl9DT05UUk9MKTsKKyAgICAgIGludGVsZ3Rfd3JpdGVfY3IwICh0cCwgMSwgY3IwWzFd KTsKKworICAgICAgc2lnbmFsID0gR0RCX0VYQ19TT0ZUV0FSRTsKKyAgICAgIHJldHVybiBUQVJH RVRfU1RPUFBFRF9CWV9OT19SRUFTT047CisgICAgfQorCisgIGlmICgoY3IwWzFdICYgKCgxIDw8 IElOVEVMR1RfQ1IwXzFfRk9SQ0VfRVhDRVBUSU9OX1NUQVRVUykKKwkJIHwgKDEgPDwgSU5URUxH VF9DUjBfMV9FWFRFUk5BTF9IQUxUX1NUQVRVUykpKSAhPSAwKQorICAgIHsKKyAgICAgIGNyMFsx XSAmPSB+KDEgPDwgSU5URUxHVF9DUjBfMV9GT1JDRV9FWENFUFRJT05fU1RBVFVTKTsKKyAgICAg IGNyMFsxXSAmPSB+KDEgPDwgSU5URUxHVF9DUjBfMV9FWFRFUk5BTF9IQUxUX1NUQVRVUyk7Cisg ICAgICBpbnRlbGd0X3dyaXRlX2NyMCAodHAsIDEsIGNyMFsxXSk7CisKKyAgICAgIHNpZ25hbCA9 IEdEQl9TSUdOQUxfVFJBUDsKKyAgICAgIHJldHVybiBUQVJHRVRfU1RPUFBFRF9CWV9OT19SRUFT T047CisgICAgfQorCisgIHNpZ25hbCA9IEdEQl9TSUdOQUxfVU5LTk9XTjsKKyAgcmV0dXJuIFRB UkdFVF9TVE9QUEVEX0JZX05PX1JFQVNPTjsKK30KKworaW50CitpbnRlbGd0X3plX3RhcmdldDo6 cmVhZF9pbnN0ICh0aHJlYWRfaW5mbyAqdHAsIENPUkVfQUREUiBwYywKKwkJCSAgICAgIGdkYjo6 YXJyYXlfdmlldzxnZGJfYnl0ZT4gYnVmZmVyKQoreworICBnZGJfYXNzZXJ0IChidWZmZXIuc2l6 ZSAoKSA+PSBpbnRlbGd0OjpNQVhfSU5TVF9MRU5HVEgpOworCisgIGludCBzdGF0dXMgPSByZWFk X21lbW9yeSAodHAsIHBjLCBidWZmZXIuZGF0YSAoKSwgaW50ZWxndDo6TUFYX0lOU1RfTEVOR1RI KTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIHJldHVybiBpbnRlbGd0OjpNQVhfSU5TVF9MRU5H VEg7CisKKyAgc3RhdHVzID0gcmVhZF9tZW1vcnkgKHRwLCBwYywgYnVmZmVyLmRhdGEgKCksIGlu dGVsZ3Q6OkNPTVBBQ1RfSU5TVF9MRU5HVEgpOworICBpZiAoc3RhdHVzID4gMCkKKyAgICByZXR1 cm4gc3RhdHVzOworCisgIGlmICghaW50ZWxndDo6aXNfY29tcGFjdGVkX2luc3QgKGJ1ZmZlcikp CisgICAgcmV0dXJuIC1FSU87CisKKyAgbWVtc2V0IChidWZmZXIuYmVnaW4gKCkgKyBpbnRlbGd0 OjpDT01QQUNUX0lOU1RfTEVOR1RILCAwLAorCSAgaW50ZWxndDo6TUFYX0lOU1RfTEVOR1RIIC0g aW50ZWxndDo6Q09NUEFDVF9JTlNUX0xFTkdUSCk7CisKKyAgcmV0dXJuIGludGVsZ3Q6OkNPTVBB Q1RfSU5TVF9MRU5HVEg7Cit9CisKK2Jvb2wKK2ludGVsZ3RfemVfdGFyZ2V0Ojppc19hdF9icmVh a3BvaW50ICh0aHJlYWRfaW5mbyAqdHApCit7CisgIHJlZ2NhY2hlICpyZWdjYWNoZSA9IGdldF90 aHJlYWRfcmVnY2FjaGUgKHRwLCAvKiBmZXRjaCA9ICovIHRydWUpOworICBDT1JFX0FERFIgcGMg PSByZWFkX3BjIChyZWdjYWNoZSk7CisKKyAgZ2RiX2J5dGUgaW5zdFtpbnRlbGd0OjpNQVhfSU5T VF9MRU5HVEhdOworICBpbnQgc3RhdHVzID0gcmVhZF9pbnN0ICh0cCwgcGMsIGluc3QpOworICBp ZiAoc3RhdHVzIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIGludGVsZ3Q6Omhh c19icmVha3BvaW50IChpbnN0KTsKK30KKworYm9vbAoraW50ZWxndF96ZV90YXJnZXQ6OmlzX2F0 X2VvdCAodGhyZWFkX2luZm8gKnRwKQoreworICByZWdjYWNoZSAqcmVnY2FjaGUgPSBnZXRfdGhy ZWFkX3JlZ2NhY2hlICh0cCwgLyogZmV0Y2ggPSAqLyB0cnVlKTsKKyAgQ09SRV9BRERSIHBjID0g cmVhZF9wYyAocmVnY2FjaGUpOworCisgIGdkYl9ieXRlIGluc3RbaW50ZWxndDo6TUFYX0lOU1Rf TEVOR1RIXTsKKyAgaW50IHN0YXR1cyA9IHJlYWRfaW5zdCAodHAsIHBjLCBpbnN0KTsKKyAgaWYg KHN0YXR1cyA8IDApCisgICAgeworICAgICAgemVfZGV2aWNlX3RocmVhZF90IHplaWQgPSB6ZV90 aHJlYWRfaWQgKHRwKTsKKworICAgICAgd2FybmluZyAoXygiZXJyb3IgcmVhZGluZyBtZW1vcnkg Zm9yIHRocmVhZCAlcyAoJXMpIGF0IDB4JSIKKwkJIFBSSXg2NCksIHRwLT5pZC50b19zdHJpbmcg KCkuY19zdHIgKCksCisJICAgICAgIHplX3RocmVhZF9pZF9zdHIgKHplaWQpLmNfc3RyICgpLCBw Yyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHVpbnQ4X3Qgb3BjID0gaW5zdFsw XSAmIGludGVsZ3Q6Ok9QQ19NQVNLOworICBzd2l0Y2ggKG9wYykKKyAgICB7CisgICAgY2FzZSBp bnRlbGd0OjpPUENfU0VORDoKKyAgICBjYXNlIGludGVsZ3Q6Ok9QQ19TRU5EQzoKKyAgICAgIHJl dHVybiBpbnRlbGd0OjpnZXRfaW5zdF9iaXQgKGluc3QsIGludGVsZ3Q6OkNUUkxfRU9UKTsKKwor ICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKiBSZXR1cm4g d2hldGhlciBlcnJhdHVtICMxODAyMDM1NTgxMyBhcHBsaWVzLiAgKi8KKworYm9vbAoraW50ZWxn dF96ZV90YXJnZXQ6OmVycmF0dW1fMTgwMjAzNTU4MTMgKHRocmVhZF9pbmZvICp0cCkKK3sKKyAg Y29uc3QgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0gdHAtPnByb2Nlc3MgKCk7CisgIGlmIChwcm9j ZXNzID09IG51bGxwdHIpCisgICAgeworICAgICAgemVfZGV2aWNlX3RocmVhZF90IHplaWQgPSB6 ZV90aHJlYWRfaWQgKHRwKTsKKworICAgICAgd2FybmluZyAoXygiZXJyb3IgZ2V0dGluZyBwcm9j ZXNzIGZvciB0aHJlYWQgJXMgKCVzKSIpLAorCSAgICAgICB0cC0+aWQudG9fc3RyaW5nICgpLmNf c3RyICgpLAorCSAgICAgICB6ZV90aHJlYWRfaWRfc3RyICh6ZWlkKS5jX3N0ciAoKSk7CisgICAg ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHByb2Nlc3NfaW5mb19wcml2YXRlICp6ZWluZm8g PSBwcm9jZXNzLT5wcml2OworICBnZGJfYXNzZXJ0ICh6ZWluZm8gIT0gbnVsbHB0cik7CisKKyAg LyogV2UgbWF5IG5vdCBoYXZlIGEgZGV2aWNlIGlmIHdlIGdvdCBkZXRhY2hlZC4gICovCisgIHpl X2RldmljZV9pbmZvICpkZXZpY2UgPSB6ZWluZm8tPmRldmljZTsKKyAgaWYgKGRldmljZSA9PSBu dWxscHRyKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgZXJyYXR1bSBvbmx5IGFwcGxp ZXMgdG8gSW50ZWwgZGV2aWNlcy4gICovCisgIGlmIChkZXZpY2UtPnByb3BlcnRpZXMudmVuZG9y SWQgIT0gMHg4MDg2KQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgZXJyYXR1bSBvbmx5 IGFwcGxpZXMgdG8gYSByYW5nZSBvZiBkZXZpY2VzLiAgKi8KKyAgc3dpdGNoIChkZXZpY2UtPnBy b3BlcnRpZXMuZGV2aWNlSWQpCisgICAgeworICAgIGNhc2UgMHg0ZjgwOgorICAgIGNhc2UgMHg0 ZjgxOgorICAgIGNhc2UgMHg0ZjgyOgorICAgIGNhc2UgMHg0ZjgzOgorICAgIGNhc2UgMHg0Zjg0 OgorICAgIGNhc2UgMHg0Zjg1OgorICAgIGNhc2UgMHg0Zjg2OgorICAgIGNhc2UgMHg0Zjg3Ogor ICAgIGNhc2UgMHg0Zjg4OgorICAgIGNhc2UgMHg1NmEwOgorICAgIGNhc2UgMHg1NmExOgorICAg IGNhc2UgMHg1NmEyOgorICAgIGNhc2UgMHg1NjkwOgorICAgIGNhc2UgMHg1NjkxOgorICAgIGNh c2UgMHg1NjkyOgorICAgIGNhc2UgMHg1NmMwOgorICAgIGNhc2UgMHg1NmMxOgorICAgIGNhc2Ug MHg1NmMyOgorICAgIGNhc2UgMHg1NmEzOgorICAgIGNhc2UgMHg1NmE0OgorICAgIGNhc2UgMHg1 NmE1OgorICAgIGNhc2UgMHg1NmE2OgorICAgIGNhc2UgMHg1NjkzOgorICAgIGNhc2UgMHg1Njk0 OgorICAgIGNhc2UgMHg1Njk1OgorICAgIGNhc2UgMHg1Njk2OgorICAgIGNhc2UgMHg1Njk3Ogor ICAgIGNhc2UgMHg1NmIwOgorICAgIGNhc2UgMHg1NmIxOgorICAgIGNhc2UgMHg1NmIyOgorICAg IGNhc2UgMHg1NmIzOgorICAgIGNhc2UgMHg1NmJhOgorICAgIGNhc2UgMHg1NmJiOgorICAgIGNh c2UgMHg1NmJjOgorICAgIGNhc2UgMHg1NmJkOgorCisgICAgY2FzZSAweDBiZDA6CisgICAgY2Fz ZSAweDBiZDQ6CisgICAgY2FzZSAweDBiZDU6CisgICAgY2FzZSAweDBiZDY6CisgICAgY2FzZSAw eDBiZDc6CisgICAgY2FzZSAweDBiZDg6CisgICAgY2FzZSAweDBiZDk6CisgICAgY2FzZSAweDBi ZGE6CisgICAgY2FzZSAweDBiZGI6CisgICAgY2FzZSAweDBiNjk6CisgICAgY2FzZSAweDBiNmU6 CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg fQorCisgIHJlZ2NhY2hlICpyZWdjYWNoZSA9IGdldF90aHJlYWRfcmVnY2FjaGUgKHRwLCAvKiBm ZXRjaCA9ICovIHRydWUpOworICBDT1JFX0FERFIgcGMgPSByZWFkX3BjIChyZWdjYWNoZSk7CisK KyAgZ2RiX2J5dGUgaW5zdFtpbnRlbGd0OjpNQVhfSU5TVF9MRU5HVEhdOworICBpbnQgc3RhdHVz ID0gcmVhZF9pbnN0ICh0cCwgcGMsIGluc3QpOworICBpZiAoc3RhdHVzIDwgMCkKKyAgICB7Cisg ICAgICB6ZV9kZXZpY2VfdGhyZWFkX3QgemVpZCA9IHplX3RocmVhZF9pZCAodHApOworCisgICAg ICB3YXJuaW5nIChfKCJlcnJvciByZWFkaW5nIG1lbW9yeSBmb3IgdGhyZWFkICVzICglcykgYXQg MHglIgorCQkgUFJJeDY0KSwgdHAtPmlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSwKKwkgICAgICAg emVfdGhyZWFkX2lkX3N0ciAoemVpZCkuY19zdHIgKCksIHBjKTsKKyAgICAgIHJldHVybiBmYWxz ZTsKKyAgICB9CisKKyAgLyogVGhlIGVycmF0dW0gYXBwbGllcyB0byBpbnN0cnVjdGlvbnMgd2l0 aG91dCBicmVha3BvaW50IGNvbnRyb2wuICAqLworICByZXR1cm4gIWludGVsZ3Q6Omhhc19icmVh a3BvaW50IChpbnN0KTsKK30KKwordm9pZAoraW50ZWxndF96ZV90YXJnZXQ6OnByZXBhcmVfdGhy ZWFkX3Jlc3VtZSAodGhyZWFkX2luZm8gKnRwKQoreworICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9 IHplX3RocmVhZCAodHApOworICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxwdHIpOworCisgIHJl Z2NhY2hlICpyZWdjYWNoZSA9IGdldF90aHJlYWRfcmVnY2FjaGUgKHRwLCAvKiBmZXRjaCA9ICov IHRydWUpOworICB1aW50MzJfdCBjcjBbM10gPSB7CisgICAgaW50ZWxndF9yZWFkX2NyMCAocmVn Y2FjaGUsIDApLAorICAgIGludGVsZ3RfcmVhZF9jcjAgKHJlZ2NhY2hlLCAxKSwKKyAgICBpbnRl bGd0X3JlYWRfY3IwIChyZWdjYWNoZSwgMikKKyAgfTsKKworICAvKiBUaGUgdGhyZWFkIGlzIHJ1 bm5pbmcuICBXZSBtYXkgbmVlZCB0byBvdmVyd3JpdGUgdGhpcyBiZWxvdy4gICovCisgIHpldHAt PmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfUlVOTklORzsKKworICAvKiBDbGVhciBhbnkg cG90ZW50aWFsIGludGVycnVwdCBpbmRpY2F0aW9uLgorCisgICAgIFdlIGxlYXZlIG90aGVyIGV4 Y2VwdGlvbiBpbmRpY2F0aW9ucyBzbyB0aGUgZXhjZXB0aW9uIHdvdWxkIGJlCisgICAgIHJlcG9y dGVkIGFnYWluIGFuZCBjYW4gYmUgaGFuZGxlZCBieSBHREIuICAqLworICBjcjBbMV0gJj0gfigx IDw8IElOVEVMR1RfQ1IwXzFfRk9SQ0VfRVhDRVBUSU9OX1NUQVRVUyk7CisgIGNyMFsxXSAmPSB+ KDEgPDwgSU5URUxHVF9DUjBfMV9FWFRFUk5BTF9IQUxUX1NUQVRVUyk7CisKKyAgLyogRGlzdGlu Z3Vpc2ggc3RlcHBpbmcgYW5kIGNvbnRpbnVpbmcuICAqLworICBzd2l0Y2ggKHpldHAtPnJlc3Vt ZV9zdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9USFJFQURfUkVTVU1FX1NURVA6CisgICAgICAv KiBXZSBzdGVwIGJ5IGluZGljYXRpbmcgYSBicmVha3BvaW50IGV4Y2VwdGlvbiwgd2hpY2ggd2ls bCBiZQorCSBjb25zaWRlcmVkIG9uIHRoZSBuZXh0IGluc3RydWN0aW9uLgorCisJIFRoaXMgZG9l cyBub3Qgd29yayBmb3IgRU9ULCB0aG91Z2guICAqLworICAgICAgaWYgKCFpc19hdF9lb3QgKHRw KSkKKwl7CisJICBjcjBbMV0gfD0gKDEgPDwgSU5URUxHVF9DUjBfMV9CUkVBS1BPSU5UX1NUQVRV Uyk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEF0IEVPVCwgdGhlIHRocmVhZCBkaXNwYXRj aCBlbmRzIGFuZCB0aGUgdGhyZWFkIGJlY29tZXMgaWRsZS4KKworCSBUaGVyZSdzIG5vIHBvaW50 IGluIHJlcXVlc3RpbmcgYSBzaW5nbGUtc3RlcCBleGNlcHRpb24gYnV0IHdlCisJIG5lZWQgdG8g aW5qZWN0IGFuIGV2ZW50IHRvIHRlbGwgR0RCIHRoYXQgdGhlIHN0ZXAgY29tcGxldGVkLiAgKi8K KyAgICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfVU5BVkFJTEFCTEU7Cisg ICAgICB6ZXRwLT53YWl0c3RhdHVzLnNldF91bmF2YWlsYWJsZSAoKTsKKworICAgICAgW1tmYWxs dGhyb3VnaF1dOworICAgIGNhc2UgWkVfVEhSRUFEX1JFU1VNRV9SVU46CisgICAgICBjcjBbMV0g Jj0gfigxIDw8IElOVEVMR1RfQ1IwXzFfQlJFQUtQT0lOVF9TVEFUVVMpOworICAgICAgYnJlYWs7 CisKKyAgICBkZWZhdWx0OgorICAgICAgaW50ZXJuYWxfZXJyb3IgKF8oImJhZCByZXN1bWUga2lu ZDogJWQuIiksIHpldHAtPnJlc3VtZV9zdGF0ZSk7CisgICAgfQorCisgIC8qIFdoZW4gc3RlcHBp bmcgb3ZlciBhIGJyZWFrcG9pbnQsIHdlIG5lZWQgdG8gc3VwcHJlc3MgdGhlIGJyZWFrcG9pbnQK KyAgICAgZXhjZXB0aW9uIHdlIHdvdWxkIG90aGVyd2lzZSBnZXQgaW1tZWRpYXRlbHkuCisKKyAg ICAgVGhpcyByZXF1aXJlcyBicmVha3BvaW50cyB0byBiZSBhbHJlYWR5IGluc2VydGVkIHdoZW4g dGhpcyBmdW5jdGlvbgorICAgICBpcyBjYWxsZWQuICBJdCBhbHNvIGhhbmRsZXMgcGVybWFuZW50 IGJyZWFrcG9pbnRzLiAgKi8KKyAgaWYgKGlzX2F0X2JyZWFrcG9pbnQgKHRwKSkKKyAgICBjcjBb MF0gfD0gKDEgPDwgSU5URUxHVF9DUjBfMF9CUkVBS1BPSU5UX1NVUFBSRVNTKTsKKworICBpbnRl bGd0X3dyaXRlX2NyMCAocmVnY2FjaGUsIDAsIGNyMFswXSk7CisgIGludGVsZ3Rfd3JpdGVfY3Iw IChyZWdjYWNoZSwgMSwgY3IwWzFdKTsKKyAgaW50ZWxndF93cml0ZV9jcjAgKHJlZ2NhY2hlLCAy LCBjcjBbMl0pOworCisgIGRwcmludGYgKCJ0aHJlYWQgJXMgKCVzKSByZXN1bWVkLCBjcjAuMD0l IiBQUkl4MzIgIiAuMT0lIiBQUkl4MzIKKwkgICAiIC4yPSUiIFBSSXgzMiAiLiIsIHRwLT5pZC50 b19zdHJpbmcgKCkuY19zdHIgKCksCisJICAgemVfdGhyZWFkX2lkX3N0ciAoemV0cC0+aWQpLmNf c3RyICgpLCBjcjBbMF0sIGNyMFsxXSwgY3IwWzJdKTsKK30KKwordm9pZAoraW50ZWxndF96ZV90 YXJnZXQ6OmFkZF9yZWdzZXQgKHRhcmdldF9kZXNjICp0ZGVzYywKKwkJCSAgICAgICBjb25zdCB6 ZV9kZXZpY2VfcHJvcGVydGllc190ICZkZXZpY2UsCisJCQkgICAgICAgY29uc3QgemV0X2RlYnVn X3JlZ3NldF9wcm9wZXJ0aWVzX3QgJnJlZ3Byb3AsCisJCQkgICAgICAgbG9uZyAmcmVnbnVtLCB6 ZV9yZWdzZXRfaW5mb190ICZyZWdzZXRzLAorCQkJICAgICAgIGV4cGVkaXRlX3QgJmV4cGVkaXRl KQoreworICB0ZGVzY19mZWF0dXJlICpmZWF0dXJlID0gbnVsbHB0cjsKKworICB6ZV9yZWdzZXRf aW5mbyByZWdzZXQgPSB7fTsKKyAgcmVnc2V0LnR5cGUgPSAodWludDMyX3QpIHJlZ3Byb3AudHlw ZTsKKyAgcmVnc2V0LnNpemUgPSByZWdwcm9wLmJ5dGVTaXplOworICByZWdzZXQuYmVnaW4gPSBy ZWdudW07CisgIHJlZ3NldC5pc193cml0ZWFibGUKKyAgICA9ICgocmVncHJvcC5nZW5lcmFsRmxh Z3MgJiBaRVRfREVCVUdfUkVHU0VUX0ZMQUdfV1JJVEVBQkxFKSAhPSAwKTsKKworICBpZiAocmVn cHJvcC5jb3VudCA8IDEpCisgICAgeworICAgICAgd2FybmluZyAoXygiSWdub3JpbmcgZW1wdHkg cmVnc2V0ICV1IGluICVzLiIpLCByZWdwcm9wLnR5cGUsCisJICAgICAgIGRldmljZS5uYW1lKTsK KyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKChyZWdwcm9wLmdlbmVyYWxGbGFncyAmIFpF VF9ERUJVR19SRUdTRVRfRkxBR19SRUFEQUJMRSkgPT0gMCkKKyAgICB7CisgICAgICB3YXJuaW5n IChfKCJJZ25vcmluZyBub24tcmVhZGFibGUgcmVnc2V0ICV1IGluICVzLiIpLCByZWdwcm9wLnR5 cGUsCisJICAgICAgIGRldmljZS5uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3dp dGNoIChyZWdwcm9wLnR5cGUpCisgICAgeworICAgIGNhc2UgWkVUX0RFQlVHX1JFR1NFVF9UWVBF X0dSRl9JTlRFTF9HUFU6CisgICAgICBmZWF0dXJlID0gdGRlc2NfY3JlYXRlX2ZlYXR1cmUgKHRk ZXNjLCBpbnRlbGd0OjpGRUFUVVJFX0dSRik7CisKKyAgICAgIGV4cGVkaXRlLnB1c2hfYmFjayAo InIwIik7CisKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVyZSwgcmVnbnVtLCAiciIs IHJlZ3Byb3AuY291bnQsICJncmYiLAorCQkJICByZWdwcm9wLmJpdFNpemUsCisJCQkgIGludGVs Z3RfdWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkJIDMydSks CisJCQkgIGV4cGVkaXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVCVUdfUkVH U0VUX1RZUEVfQUREUl9JTlRFTF9HUFU6CisgICAgICBmZWF0dXJlID0gdGRlc2NfY3JlYXRlX2Zl YXR1cmUgKHRkZXNjLCBpbnRlbGd0OjpGRUFUVVJFX0FERFIpOworCisgICAgICBpbnRlbGd0X2Fk ZF9yZWdzZXQgKGZlYXR1cmUsIHJlZ251bSwgImEiLCByZWdwcm9wLmNvdW50LCAiYXJmIiwKKwkJ CSAgcmVncHJvcC5iaXRTaXplLAorCQkJICBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUs IHJlZ3Byb3AuYml0U2l6ZSwKKwkJCQkJCSAxNnUpLAorCQkJICBleHBlZGl0ZSk7CisgICAgICBi cmVhazsKKworICAgIGNhc2UgWkVUX0RFQlVHX1JFR1NFVF9UWVBFX0ZMQUdfSU5URUxfR1BVOgor ICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVB VFVSRV9GTEFHKTsKKworICAgICAgaW50ZWxndF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0s ICJmIiwgcmVncHJvcC5jb3VudCwgImFyZiIsCisJCQkgIHJlZ3Byb3AuYml0U2l6ZSwKKwkJCSAg aW50ZWxndF91aW50X3JlZ190eXBlIChmZWF0dXJlLCByZWdwcm9wLmJpdFNpemUsCisJCQkJCQkg MTZ1KSwKKwkJCSAgZXhwZWRpdGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpFVF9ERUJV R19SRUdTRVRfVFlQRV9DRV9JTlRFTF9HUFU6CisgICAgICAvKiBXZSBleHBlY3QgYSBzaW5nbGUg J2NlJyByZWdpc3Rlci4gICovCisgICAgICBpZiAocmVncHJvcC5jb3VudCAhPSAxKQorCXdhcm5p bmcgKF8oIklnbm9yaW5nICV1IHVuZXhwZWN0ZWQgJ2NlJyByZWdpc3RlcnMgaW4gJXMuIiksCisJ CSByZWdwcm9wLmNvdW50IC0gMSwgZGV2aWNlLm5hbWUpOworCisgICAgICBmZWF0dXJlID0gdGRl c2NfY3JlYXRlX2ZlYXR1cmUgKHRkZXNjLCBpbnRlbGd0OjpGRUFUVVJFX0NFKTsKKworICAgICAg dGRlc2NfY3JlYXRlX3JlZyAoZmVhdHVyZSwgImNlIiwgcmVnbnVtKyssIDEsICJhcmYiLAorCQkJ cmVncHJvcC5iaXRTaXplLAorCQkJaW50ZWxndF91aW50X3JlZ190eXBlIChmZWF0dXJlLCByZWdw cm9wLmJpdFNpemUsCisJCQkJCSAgICAgICAzMnUpKTsKKworICAgICAgZXhwZWRpdGUucHVzaF9i YWNrICgiY2UiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZ UEVfU1JfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0 ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9TUik7CisKKyAgICAgIGV4cGVkaXRlLnB1c2hfYmFjayAo InNyMCIpOworICAgICAgaW50ZWxndF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0sICJzciIs IHJlZ3Byb3AuY291bnQsICJhcmYiLAorCQkJICByZWdwcm9wLmJpdFNpemUsCisJCQkgIGludGVs Z3RfdWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkJIDMydSks CisJCQkgIGV4cGVkaXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVCVUdfUkVH U0VUX1RZUEVfQ1JfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0 dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9DUik7CisKKyAgICAgIGV4cGVkaXRlLnB1c2hf YmFjayAoImNyMCIpOworICAgICAgaW50ZWxndF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0s ICJjciIsIHJlZ3Byb3AuY291bnQsICJhcmYiLAorCQkJICByZWdwcm9wLmJpdFNpemUsCisJCQkg IGludGVsZ3RfdWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkJ IDMydSksCisJCQkgIGV4cGVkaXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVC VUdfUkVHU0VUX1RZUEVfVERSX0lOVEVMX0dQVToKKyAgICAgIGZlYXR1cmUgPSB0ZGVzY19jcmVh dGVfZmVhdHVyZSAodGRlc2MsIGludGVsZ3Q6OkZFQVRVUkVfVERSKTsKKworICAgICAgaW50ZWxn dF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0sICJ0ZHIiLCByZWdwcm9wLmNvdW50LCAiYXJm IiwKKwkJCSAgcmVncHJvcC5iaXRTaXplLAorCQkJICBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZl YXR1cmUsIHJlZ3Byb3AuYml0U2l6ZSwKKwkJCQkJCSAxNnUpLAorCQkJICBleHBlZGl0ZSk7Cisg ICAgICBicmVhazsKKworICAgIGNhc2UgWkVUX0RFQlVHX1JFR1NFVF9UWVBFX0FDQ19JTlRFTF9H UFU6CisgICAgICBmZWF0dXJlID0gdGRlc2NfY3JlYXRlX2ZlYXR1cmUgKHRkZXNjLCBpbnRlbGd0 OjpGRUFUVVJFX0FDQyk7CisKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVyZSwgcmVn bnVtLCAiYWNjIiwgcmVncHJvcC5jb3VudCwgImFyZiIsCisJCQkgIHJlZ3Byb3AuYml0U2l6ZSwK KwkJCSAgaW50ZWxndF91aW50X3JlZ190eXBlIChmZWF0dXJlLCByZWdwcm9wLmJpdFNpemUsCisJ CQkJCQkgMzJ1KSwKKwkJCSAgZXhwZWRpdGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpF VF9ERUJVR19SRUdTRVRfVFlQRV9NTUVfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNj X2NyZWF0ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9NTUUpOworCisgICAgICBp bnRlbGd0X2FkZF9yZWdzZXQgKGZlYXR1cmUsIHJlZ251bSwgIm1tZSIsIHJlZ3Byb3AuY291bnQs ICJhcmYiLAorCQkJICByZWdwcm9wLmJpdFNpemUsCisJCQkgIGludGVsZ3RfdWludF9yZWdfdHlw ZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkJIDMydSksCisJCQkgIGV4cGVkaXRl KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfU1BfSU5U RUxfR1BVOgorICAgICAgLyogV2UgZXhwZWN0IGEgc2luZ2xlICdzcCcgcmVnaXN0ZXIuICAqLwor ICAgICAgaWYgKHJlZ3Byb3AuY291bnQgIT0gMSkKKwl3YXJuaW5nIChfKCJJZ25vcmluZyAldSB1 bmV4cGVjdGVkICdzcCcgcmVnaXN0ZXJzIGluICVzLiIpLAorCQkgcmVncHJvcC5jb3VudCAtIDEs IGRldmljZS5uYW1lKTsKKworICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0 ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9TUCk7CisKKyAgICAgIHRkZXNjX2NyZWF0ZV9yZWcgKGZl YXR1cmUsICJzcCIsIHJlZ251bSsrLCAxLCAiYXJmIiwKKwkJCXJlZ3Byb3AuYml0U2l6ZSwKKwkJ CWludGVsZ3RfdWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkg ICAgICAgcmVncHJvcC5iaXRTaXplKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVUX0RF QlVHX1JFR1NFVF9UWVBFX1NCQV9JTlRFTF9HUFU6CisgICAgICBmZWF0dXJlID0gdGRlc2NfY3Jl YXRlX2ZlYXR1cmUgKHRkZXNjLCBpbnRlbGd0OjpGRUFUVVJFX1NCQSk7CisKKyAgICAgIHN3aXRj aCAocmVncHJvcC52ZXJzaW9uKQorCXsKKwljYXNlIDA6CisJICB7CisJICAgIGNvbnN0IGNoYXIg KnJlZ3R5cGUgPSBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUsCisJCQkJCQkJIHJlZ3By b3AuYml0U2l6ZSwKKwkJCQkJCQkgcmVncHJvcC5iaXRTaXplKTsKKwkgICAgY29uc3QgY2hhciAq c2JhcmVnc1tdID0geworCSAgICAgICJnZW5zdGJhc2UiLAorCSAgICAgICJzdXN0YmFzZSIsCisJ ICAgICAgImR5bmJhc2UiLAorCSAgICAgICJpb2Jhc2UiLAorCSAgICAgICJpc2FiYXNlIiwKKwkg ICAgICAiYmxzdXN0YmFzZSIsCisJICAgICAgImJsc2FzdGJhc2UiLAorCSAgICAgICJidGJhc2Ui LAorCSAgICAgICJzY3JiYXNlIiwKKwkgICAgICAic2NyYmFzZTIiLAorCSAgICAgIG51bGxwdHIK KwkgICAgfTsKKwkgICAgaW50IHJlZyA9IDA7CisJICAgIGZvciAoOyAocmVnIDwgcmVncHJvcC5j b3VudCkgJiYgKHNiYXJlZ3NbcmVnXSAhPSBudWxscHRyKTsgKytyZWcpCisJICAgICAgeworCQlp ZiAoKHN0cmNtcCAoc2JhcmVnc1tyZWddLCAiZ2Vuc3RiYXNlIikgPT0gMCkKKwkJICAgIHx8IChz dHJjbXAgKHNiYXJlZ3NbcmVnXSwgImlzYWJhc2UiKSA9PSAwKSkKKwkJICB7CisJCSAgICBleHBl ZGl0ZS5wdXNoX2JhY2sgKHNiYXJlZ3NbcmVnXSk7CisJCSAgfQorCisJCXRkZXNjX2NyZWF0ZV9y ZWcgKGZlYXR1cmUsIHNiYXJlZ3NbcmVnXSwgcmVnbnVtKyssIDEsCisJCQkJICAidmlydHVhbCIs IHJlZ3Byb3AuYml0U2l6ZSwgcmVndHlwZSk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisK KwlkZWZhdWx0OgorCSAgd2FybmluZyAoXygiSWdub3JpbmcgdW5rbm93biBTQkEgcmVnc2V0IHZl cnNpb24gJXUgaW4gJXMiKSwKKwkJICAgcmVncHJvcC52ZXJzaW9uLCBkZXZpY2UubmFtZSk7CisJ ICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVUX0RFQlVHX1JFR1NFVF9U WVBFX0RCR19JTlRFTF9HUFU6CisgICAgICBmZWF0dXJlID0gdGRlc2NfY3JlYXRlX2ZlYXR1cmUg KHRkZXNjLCBpbnRlbGd0OjpGRUFUVVJFX0RCRyk7CisKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3Nl dCAoZmVhdHVyZSwgcmVnbnVtLCAiZGJnIiwgcmVncHJvcC5jb3VudCwgImFyZiIsCisJCQkgIHJl Z3Byb3AuYml0U2l6ZSwKKwkJCSAgaW50ZWxndF91aW50X3JlZ190eXBlIChmZWF0dXJlLCByZWdw cm9wLmJpdFNpemUsCisJCQkJCQkgMzJ1KSwKKwkJCSAgZXhwZWRpdGUpOworICAgICAgYnJlYWs7 CisKKyAgICBjYXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9GQ19JTlRFTF9HUFU6CisgICAgICBm ZWF0dXJlID0gdGRlc2NfY3JlYXRlX2ZlYXR1cmUgKHRkZXNjLCBpbnRlbGd0OjpGRUFUVVJFX0ZD KTsKKworICAgICAgaW50ZWxndF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0sICJmYyIsIHJl Z3Byb3AuY291bnQsICJhcmYiLAorCQkJICByZWdwcm9wLmJpdFNpemUsCisJCQkgIGludGVsZ3Rf dWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkJIDMydSksCisJ CQkgIGV4cGVkaXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVCVUdfUkVHU0VU X1RZUEVfSU5WQUxJRF9JTlRFTF9HUFU6CisgICAgY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVf Rk9SQ0VfVUlOVDMyOgorICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChmZWF0dXJlID09IG51 bGxwdHIpCisgICAgeworICAgICAgd2FybmluZyAoXygiSWdub3JpbmcgdW5rbm93biByZWdzZXQg JXUgaW4gJXMuIiksIHJlZ3Byb3AudHlwZSwKKwkgICAgICAgZGV2aWNlLm5hbWUpOworCisgICAg ICByZXR1cm47CisgICAgfQorCisgIHJlZ3NldC5lbmQgPSByZWdudW07CisgIHJlZ3NldHMucHVz aF9iYWNrIChyZWdzZXQpOworfQorCisKKy8qIFRoZSBJbnRlbCBHVCB0YXJnZXQgb3BzIG9iamVj dC4gICovCisKK3N0YXRpYyBpbnRlbGd0X3plX3RhcmdldCB0aGVfaW50ZWxndF96ZV90YXJnZXQ7 CisKK2V4dGVybiB2b2lkIGluaXRpYWxpemVfbG93ICgpOwordm9pZAoraW5pdGlhbGl6ZV9sb3cg KCkKK3sKKyAgLyogRGVsYXllZCBpbml0aWFsaXphdGlvbiBvZiBMZXZlbC1aZXJvIHRhcmdldHMu ICBTZWUgemUtbG93LmguICAqLworICB0aGVfaW50ZWxndF96ZV90YXJnZXQuaW5pdCAoKTsKKyAg c2V0X3RhcmdldF9vcHMgKCZ0aGVfaW50ZWxndF96ZV90YXJnZXQpOworfQpkaWZmIC0tZ2l0IGEv Z2Ric2VydmVyL3plLWxvdy5jYyBiL2dkYnNlcnZlci96ZS1sb3cuY2MKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTJk NzM3NzVmOTFiNjQyZDBmOGQ5NDBhY2VjMDA1M2QzYzVjNWQzZQotLS0gL2Rldi9udWxsCisrKyBi L2dkYnNlcnZlci96ZS1sb3cuY2MKQEAgLTAsMCArMSwyOTk1IEBACisvKiBUYXJnZXQgaW50ZXJm YWNlIGZvciBMZXZlbC1aZXJvIGJhc2VkIHRhcmdldHMgZm9yIGdkYnNlcnZlci4KKyAgIFNlZSBo dHRwczovL2dpdGh1Yi5jb20vb25lYXBpLXNyYy9sZXZlbC16ZXJvLmdpdC4KKworICAgQ29weXJp Z2h0IChDKSAyMDIwLTIwMjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRo ZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKwor ICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBw cm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8K KworI2luY2x1ZGUgInplLWxvdy5oIgorI2luY2x1ZGUgImRsbC5oIgorCisjaW5jbHVkZSA8bGV2 ZWxfemVyby96ZXRfYXBpLmg+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHNzdHJl YW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxjc3RyaW5nPiAvKiBGb3Igc25wcmlu dGYuICAqLworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUg PGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZm5kZWYgVVNFX1dJTjMyQVBJCisjICBp bmNsdWRlIDxzaWduYWwuaD4KKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworCisvKiBD b252ZW5pZW5jZSBtYWNyb3MuICAqLworCisjZGVmaW5lIGRwcmludGYoLi4uKQkJCQkJCVwKKyAg ZG8JCQkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICBpZiAoZGVidWdfdGhyZWFkcykJCQkJ CVwKKwl7CQkJCQkJCVwKKwkgIGRlYnVnX3ByaW50ZiAoIiVzOiAiLCBfX0ZVTkNUSU9OX18pOwkJ CVwKKwkgIGRlYnVnX3ByaW50ZiAoX19WQV9BUkdTX18pOwkJCQlcCisJICBkZWJ1Z19wcmludGYg KCJcbiIpOwkJCQkJXAorCX0JCQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgd2hpbGUgKDApCisK KyNpZm5kZWYgVVNFX1dJTjMyQVBJCisvKiBBc3luYyBpbnRlcmFjdGlvbiBzdHVmZi4KKworICAg VGhlIHJlYWQvd3JpdGUgZW5kcyBvZiB0aGUgcGlwZSByZWdpc3RlcmVkIGFzIHdhaXRhYmxlIGZp bGUgaW4gdGhlCisgICBldmVudCBsb29wLiAgKi8KK3N0YXRpYyBpbnQgemVfZXZlbnRfcGlwZVsy XSA9IHsgLTEsIC0xIH07CisjZW5kaWYKKworLyogUmV0dXJuIHdoZXRoZXIgd2UncmUgaW4gYXN5 bmMgbW9kZS4gICovCisKK3N0YXRpYyBib29sCit6ZV9pc19hc3luYyAoKQoreworI2lmbmRlZiBV U0VfV0lOMzJBUEkKKyAgcmV0dXJuICh6ZV9ldmVudF9waXBlWzBdICE9IC0xKTsKKyNlbHNlCisg IHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisvKiBHZXQgcmlkIG9mIGFueSBwZW5kaW5nIGV2 ZW50IGluIHRoZSBwaXBlLiAgKi8KKworc3RhdGljIHZvaWQKK3plX2FzeW5jX2ZsdXNoICgpCit7 CisgIGlmICghemVfaXNfYXN5bmMgKCkpCisgICAgcmV0dXJuOworCisjaWZuZGVmIFVTRV9XSU4z MkFQSQorICBpbnQgcmV0OworICBjaGFyIGJ1ZjsKKworICBlcnJubyA9IDA7CisgIGRvCisgICAg cmV0ID0gcmVhZCAoemVfZXZlbnRfcGlwZVswXSwgJmJ1ZiwgMSk7CisgIHdoaWxlIChyZXQgPj0g MCB8fCAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKSk7CisjZWxzZQorICBlcnJvciAoXygi JXM6IHRiZCIpLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCit9CisKKy8qIFB1dCBzb21ldGhpbmcg aW4gdGhlIHBpcGUsIHNvIHRoZSBldmVudCBsb29wIHdha2VzIHVwLiAgKi8KKworc3RhdGljIHZv aWQKK3plX2FzeW5jX21hcmsgKCkKK3sKKyAgaWYgKCF6ZV9pc19hc3luYyAoKSkKKyAgICByZXR1 cm47CisKKyNpZm5kZWYgVVNFX1dJTjMyQVBJCisgIGludCByZXQ7CisKKyAgemVfYXN5bmNfZmx1 c2ggKCk7CisKKyAgZXJybm8gPSAwOworICBkbworICAgIHJldCA9IHdyaXRlICh6ZV9ldmVudF9w aXBlWzFdLCAiKyIsIDEpOworICB3aGlsZSAocmV0ID09IDAgfHwgKHJldCA9PSAtMSAmJiBlcnJu byA9PSBFSU5UUikpOworCisgIC8qIElnbm9yZSBFQUdBSU4uICBJZiB0aGUgcGlwZSBpcyBmdWxs LCB0aGUgZXZlbnQgbG9vcCB3aWxsIGFscmVhZHkKKyAgICAgYmUgYXdha2VuZWQgYW55d2F5LiAg Ki8KKyNlbHNlCisgIGVycm9yIChfKCIlczogdGJkIiksIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYK K30KKworLyogUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgZGV2aWNlIHRocmVhZCBpZCBjb21wb25l bnQgc3RyaW5nLiAgKi8KKworc3RhdGljIHN0ZDo6c3RyaW5nCit6ZV90aHJlYWRfaWRfY29tcG9u ZW50X3N0ciAodWludDMyX3QgY29tcG9uZW50KQoreworICBpZiAoY29tcG9uZW50ID09IFVJTlQz Ml9NQVgpCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nICgiYWxsIik7CisKKyAgcmV0dXJuIHN0ZDo6 dG9fc3RyaW5nIChjb21wb25lbnQpOworfQorCisvKiBTZWUgemUtbG93LmguICAqLworCitzdGQ6 OnN0cmluZworemVfdGhyZWFkX2lkX3N0ciAoY29uc3QgemVfZGV2aWNlX3RocmVhZF90ICZ0aHJl YWQpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07CisgIHNzdHJlYW0gPDwgemVfdGhy ZWFkX2lkX2NvbXBvbmVudF9zdHIgKHRocmVhZC5zbGljZSkKKwkgIDw8ICIuIgorCSAgPDwgemVf dGhyZWFkX2lkX2NvbXBvbmVudF9zdHIgKHRocmVhZC5zdWJzbGljZSkKKwkgIDw8ICIuIgorCSAg PDwgemVfdGhyZWFkX2lkX2NvbXBvbmVudF9zdHIgKHRocmVhZC5ldSkKKwkgIDw8ICIuIgorCSAg PDwgemVfdGhyZWFkX2lkX2NvbXBvbmVudF9zdHIgKHRocmVhZC50aHJlYWQpOworCisgIHJldHVy biBzc3RyZWFtLnN0ciAoKTsKK30KKworLyogUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgVVVJRCBz dHJpbmcuICAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcKK3V1aWRfc3RyIChjb25zdCB1aW50OF90 IHV1aWRbXSwgc2l6ZV90IHNpemUpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07Cisg IHdoaWxlIChzaXplLS0pCisgICAgc3N0cmVhbSA8PCBzdGQ6OnNldHcgKDIpIDw8IHV1aWRbc2l6 ZV07CisKKyAgcmV0dXJuIHNzdHJlYW0uc3RyICgpOworfQorCisvKiBSZXR1cm4gYSBodW1hbi1y ZWFkYWJsZSBkZXZpY2UgVVVJRCBzdHJpbmcuICAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcKK2Ry aXZlcl91dWlkX3N0ciAoY29uc3QgemVfZHJpdmVyX3V1aWRfdCAmdXVpZCkKK3sKKyAgcmV0dXJu IHV1aWRfc3RyICh1dWlkLmlkLCBzaXplb2YgKHV1aWQuaWQpKTsKK30KKworLyogUmV0dXJuIGEg aHVtYW4tcmVhZGFibGUgcHJvY2VzcyBzdGF0ZSBzdHJpbmcuICAqLworCitzdGF0aWMgY29uc3Qg Y2hhciAqCit6ZV9wcm9jZXNzX3N0YXRlX3N0ciAoemVfcHJvY2Vzc19zdGF0ZSBzdGF0ZSkKK3sK KyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9QUk9DRVNTX1ZJU0lCTEU6Cisg ICAgICByZXR1cm4gInZpc2libGUiOworCisgICAgY2FzZSBaRV9QUk9DRVNTX0hJRERFTjoKKyAg ICAgIHJldHVybiAiaGlkZGVuIjsKKyAgICB9CisKKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKwor LyogUmV0dXJuIHRoZSBwaWQgZm9yIERFVklDRS4gICovCisKK3N0YXRpYyBpbnQKK3plX2Rldmlj ZV9waWQgKGNvbnN0IHplX2RldmljZV9pbmZvICZkZXZpY2UpCit7CisgIGlmIChkZXZpY2UucHJv Y2VzcyAhPSBudWxscHRyKQorICAgIHJldHVybiBkZXZpY2UucHJvY2Vzcy0+cGlkOworCisgIHJl dHVybiAwOworfQorCisvKiBSZXR1cm4gdGhlIGRldmljZSBmb3IgUFJPQ0VTUy4gICovCisKK3N0 YXRpYyB6ZV9kZXZpY2VfaW5mbyAqCit6ZV9wcm9jZXNzX2RldmljZSAocHJvY2Vzc19pbmZvICpw cm9jZXNzKQoreworICBpZiAocHJvY2VzcyA9PSBudWxscHRyKQorICAgIHJldHVybiBudWxscHRy OworCisgIHByb2Nlc3NfaW5mb19wcml2YXRlICp6ZXByb2MgPSBwcm9jZXNzLT5wcml2OworICBp ZiAoemVwcm9jID09IG51bGxwdHIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIHpl cHJvYy0+ZGV2aWNlOworfQorCisvKiBSZXR1cm4gdGhlIGRldmljZSBmb3IgVEhSRUFELiAgKi8K Kworc3RhdGljIHplX2RldmljZV9pbmZvICoKK3plX3RocmVhZF9kZXZpY2UgKGNvbnN0IHRocmVh ZF9pbmZvICp0aHJlYWQpCit7CisgIGlmICh0aHJlYWQgPT0gbnVsbHB0cikKKyAgICByZXR1cm4g bnVsbHB0cjsKKworICByZXR1cm4gemVfcHJvY2Vzc19kZXZpY2UgKHRocmVhZC0+cHJvY2VzcyAo KSk7Cit9CisKKy8qIFJldHVybnMgd2hldGhlciBJRCBpcyBpbiBTRVQuICAqLworCitzdGF0aWMg Ym9vbAoremVfZGV2aWNlX3RocmVhZF9pbiAoemVfZGV2aWNlX3RocmVhZF90IGlkLCB6ZV9kZXZp Y2VfdGhyZWFkX3Qgc2V0KQoreworICBpZiAoKHNldC5zbGljZSAhPSBVSU5UMzJfTUFYKSAmJiAo c2V0LnNsaWNlICE9IGlkLnNsaWNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKChzZXQu c3Vic2xpY2UgIT0gVUlOVDMyX01BWCkgJiYgKHNldC5zdWJzbGljZSAhPSBpZC5zdWJzbGljZSkp CisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoc2V0LmV1ICE9IFVJTlQzMl9NQVgpICYmIChz ZXQuZXUgIT0gaWQuZXUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKHNldC50aHJlYWQg IT0gVUlOVDMyX01BWCkgJiYgKHNldC50aHJlYWQgIT0gaWQudGhyZWFkKSkKKyAgICByZXR1cm4g ZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENhbGwgRlVOQyBmb3IgZWFjaCB0aHJl YWQgb24gREVWSUNFIG1hdGNoaW5nIElELiAgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+ CitzdGF0aWMgdm9pZAorZm9yX2VhY2hfdGhyZWFkIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAmZGV2 aWNlLCB6ZV9kZXZpY2VfdGhyZWFkX3QgaWQsCisJCSBGdW5jIGZ1bmMpCit7CisgIGRldmljZS5w cm9jZXNzLT5mb3JfZWFjaF90aHJlYWQgKFtpZCwgZnVuY10gKHRocmVhZF9pbmZvICp0cCkKKyAg ICB7CisgICAgICB6ZV9kZXZpY2VfdGhyZWFkX3QgdGlkID0gemVfdGhyZWFkX2lkICh0cCk7Cisg ICAgICBpZiAoemVfZGV2aWNlX3RocmVhZF9pbiAodGlkLCBpZCkpCisJZnVuYyAodHApOworICAg IH0pOworfQorCisvKiBBZGQgYSBwcm9jZXNzIGZvciBERVZJQ0UuICAqLworCitzdGF0aWMgcHJv Y2Vzc19pbmZvICoKK3plX2FkZF9wcm9jZXNzICh6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlLCB6ZV9w cm9jZXNzX3N0YXRlIHN0YXRlKQoreworICBnZGJfYXNzZXJ0IChkZXZpY2UgIT0gbnVsbHB0cik7 CisKKyAgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0gYWRkX3Byb2Nlc3MgKGRldmljZS0+b3JkaW5h bCwgMSk7CisgIHByb2Nlc3MtPnByaXYgPSBuZXcgcHJvY2Vzc19pbmZvX3ByaXZhdGUgKGRldmlj ZSwgc3RhdGUpOworICBwcm9jZXNzLT50ZGVzYyA9IGRldmljZS0+dGRlc2MuZ2V0ICgpOworICBk ZXZpY2UtPnByb2Nlc3MgPSBwcm9jZXNzOworCisgIC8qIEVudW1lcmF0ZSB0aHJlYWRzIG9uIHRo ZSBkZXZpY2Ugd2UgYXR0YWNoZWQgdG8uCisKKyAgICAgV2UgZGVidWcgdGhlIGVudGlyZSBkZXZp Y2Ugc28gd2UgY2FuIGVudW1lcmF0ZSBhbGwgdGhyZWFkcyBhdCBvbmNlLiAgVGhleQorICAgICB3 aWxsIGJlIGlkbGUgc29tZSBvZiB0aGUgdGltZSBhbmQgd2Ugd29uJ3QgYmUgYWJsZSB0byBpbnRl cmFjdCB3aXRoIHRoZW0uCisgICAgIFdoZW4gd29yayBnZXRzIHN1Ym1pdHRlZCB0byB0aGUgZGV2 aWNlLCB0aGUgdGhyZWFkIGRpc3BhdGNoZXIgd2lsbAorICAgICBkaXN0cmlidXRlIHRoZSB3b3Jr IG9udG8gZGV2aWNlIHRocmVhZHMuCisKKyAgICAgVGhlIGFsdGVybmF0aXZlIG9mIG9ubHkgcmVw cmVzZW50aW5nIHRocmVhZHMgdGhhdCBhcmUgY3VycmVudGx5IGV4ZWN1dGluZworICAgICB3b3Jr IHdvdWxkIGJlIHRvbyBpbnRydXNpdmUgYXMgd2UnZCBuZWVkIHRvIHN0b3AgZWFjaCB0aHJlYWQg b24gZXZlcnkKKyAgICAgZGlzcGF0Y2guICAqLworICBsb25nIHRpZCA9IDA7CisgIHVpbnQzMl90 IHNsaWNlLCBzc2xpY2UsIGV1LCB0aHJlYWQ7CisgIGNvbnN0IHplX2RldmljZV9wcm9wZXJ0aWVz X3QgJnByb3BlcnRpZXMgPSBkZXZpY2UtPnByb3BlcnRpZXM7CisgIGZvciAoc2xpY2UgPSAwOyBz bGljZSA8IHByb3BlcnRpZXMubnVtU2xpY2VzOyArK3NsaWNlKQorICAgIGZvciAoc3NsaWNlID0g MDsgc3NsaWNlIDwgcHJvcGVydGllcy5udW1TdWJzbGljZXNQZXJTbGljZTsgKytzc2xpY2UpCisg ICAgICBmb3IgKGV1ID0gMDsgZXUgPCBwcm9wZXJ0aWVzLm51bUVVc1BlclN1YnNsaWNlOyArK2V1 KQorCWZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgcHJvcGVydGllcy5udW1UaHJlYWRzUGVyRVU7 ICsrdGhyZWFkKQorCSAgeworCSAgICAvKiBXZSB1c2UgdGhlIGRldmljZSBvcmRpbmFsIGFzIHBy b2Nlc3MgaWQuICAqLworCSAgICBwdGlkX3QgcHRpZCA9IHB0aWRfdCAoKGludCkgZGV2aWNlLT5v cmRpbmFsLCArK3RpZCwgMGwpOworCisJICAgIC8qIFdlIGNhbiBvbmx5IHN1cHBvcnQgdGhhdCBt YW55IHRocmVhZHMuICAqLworCSAgICBpZiAodGlkIDwgMCkKKwkgICAgICBlcnJvciAoXygiVG9v IG1hbnkgdGhyZWFkcyBvbiBkZXZpY2UgJWx1OiAlcy4iKSwKKwkJICAgICBkZXZpY2UtPm9yZGlu YWwsIHByb3BlcnRpZXMubmFtZSk7CisKKwkgICAgLyogU3RvcmluZyB0aGUgMTI4YiBkZXZpY2Ug dGhyZWFkIGlkIGluIHRoZSBwcml2YXRlIGRhdGEuICBXZSBtaWdodAorCSAgICAgICB3YW50IHRv IGV4dGVuZCBwdGlkX3QgYW5kIHB1dCBpdCB0aGVyZSBzbyBHREIgY2FuIHNob3cgaXQgdG8gdGhl CisJICAgICAgIHVzZXIuICAqLworCSAgICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IG5ldyB6ZV90 aHJlYWRfaW5mbyB7fTsKKwkgICAgemV0cC0+aWQuc2xpY2UgPSBzbGljZTsKKwkgICAgemV0cC0+ aWQuc3Vic2xpY2UgPSBzc2xpY2U7CisJICAgIHpldHAtPmlkLmV1ID0gZXU7CisJICAgIHpldHAt PmlkLnRocmVhZCA9IHRocmVhZDsKKworCSAgICAvKiBBc3N1bWUgdGhyZWFkcyBhcmUgcnVubmlu ZyB1bnRpbCB3ZSBoZWFyIG90aGVyd2lzZS4gICovCisJICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBa RV9USFJFQURfU1RBVEVfUlVOTklORzsKKworCSAgICBwcm9jZXNzLT5hZGRfdGhyZWFkIChwdGlk LCB6ZXRwKTsKKwkgIH0KKworICBkZXZpY2UtPm50aHJlYWRzID0gdGlkOworICBkZXZpY2UtPm5y ZXN1bWVkID0gdGlkOworCisgIGRwcmludGYgKCJwcm9jZXNzICVkICglcykgd2l0aCAlbGQgdGhy ZWFkcyBjcmVhdGVkIGZvciBkZXZpY2UgJWx1OiAlcy4iLAorCSAgIChpbnQpIGRldmljZS0+b3Jk aW5hbCwgemVfcHJvY2Vzc19zdGF0ZV9zdHIgKHN0YXRlKSwgdGlkLAorCSAgIGRldmljZS0+b3Jk aW5hbCwgcHJvcGVydGllcy5uYW1lKTsKKworICByZXR1cm4gcHJvY2VzczsKK30KKworLyogUmVt b3ZlIGEgTGV2ZWwtWmVybyBQUk9DRVNTLiAgKi8KKworc3RhdGljIHZvaWQKK3plX3JlbW92ZV9w cm9jZXNzIChwcm9jZXNzX2luZm8gKnByb2Nlc3MpCit7CisgIGdkYl9hc3NlcnQgKHByb2Nlc3Mg IT0gbnVsbHB0cik7CisKKyAgcHJvY2Vzcy0+Zm9yX2VhY2hfdGhyZWFkIChbPV0gKHRocmVhZF9p bmZvICp0aHJlYWQpCisgICAgeworICAgICAgZGVsZXRlICh6ZV90aHJlYWRfaW5mbyAqKSB0aHJl YWQtPnRhcmdldF9kYXRhICgpOworICAgICAgcHJvY2Vzcy0+cmVtb3ZlX3RocmVhZCAodGhyZWFk KTsKKyAgICB9KTsKKworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqemVpbmZvID0gcHJvY2Vzcy0+ cHJpdjsKKyAgZ2RiX2Fzc2VydCAoemVpbmZvICE9IG51bGxwdHIpOworCisgIC8qIFdlIG1heSBv ciBtYXkgbm90IGhhdmUgYSBkZXZpY2UuCisKKyAgICAgV2hlbiB3ZSBnb3QgZGV0YWNoZWQsIHdl IHdpbGwgcmVtb3ZlIHRoZSBkZXZpY2UgZmlyc3QsIGFuZCByZW1vdmUgdGhlCisgICAgIHByb2Nl c3Mgd2hlbiB3ZSBzZWxlY3QgYW4gZXZlbnQgZnJvbSBvbmUgb2YgaXRzIHRocmVhZHMuCisKKyAg ICAgV2hlbiB3ZSBnZXQgYSBwcm9jZXNzIGV4aXQgZXZlbnQsIHRoZSBkZXZpY2Ugd2lsbCByZW1h aW4gYWZ0ZXIgdGhlIHByb2Nlc3MKKyAgICAgaGFzIGJlZW4gcmVtb3ZlZC4gICovCisgIHplX2Rl dmljZV9pbmZvICpkZXZpY2UgPSB6ZWluZm8tPmRldmljZTsKKyAgaWYgKGRldmljZSAhPSBudWxs cHRyKQorICAgIHsKKyAgICAgIGdkYl9hc3NlcnQgKGRldmljZS0+cHJvY2VzcyA9PSBwcm9jZXNz KTsKKyAgICAgIGRldmljZS0+cHJvY2VzcyA9IG51bGxwdHI7CisgICAgfQorCisgIHByb2Nlc3Mt PnByaXYgPSBudWxscHRyOworICBkZWxldGUgemVpbmZvOworCisgIHJlbW92ZV9wcm9jZXNzIChw cm9jZXNzKTsKK30KKworLyogU2hvdyBQUk9DRVNTLiAgKi8KKworc3RhdGljIHZvaWQKK3plX3No b3dfcHJvY2VzcyAocHJvY2Vzc19pbmZvICpwcm9jZXNzKQoreworICBnZGJfYXNzZXJ0IChwcm9j ZXNzICE9IG51bGxwdHIpOworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqcHJpdiA9IHByb2Nlc3Mt PnByaXY7CisKKyAgZ2RiX2Fzc2VydCAocHJpdiAhPSBudWxscHRyKTsKKyAgc3dpdGNoIChwcml2 LT5zdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9QUk9DRVNTX1ZJU0lCTEU6CisgICAgICByZXR1 cm47CisKKyAgICBjYXNlIFpFX1BST0NFU1NfSElEREVOOgorICAgICAgLyogRklYTUU6IHJlcG9y dCBzdGF0ZSBjaGFuZ2UKKworCSBTZXQgcHJpdi0+c3RhdHVzIGFuZCByZXBvcnQgdGhlIG5ldyB2 aXNpYmlsaXR5IHRvIEdEQi4gICovCisgICAgICBwcml2LT5zdGF0ZSA9IFpFX1BST0NFU1NfVklT SUJMRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW50ZXJuYWxfZXJyb3IgKF8oInVua25v d24gcHJvY2VzcyBzdGF0ZSIpKTsKK30KKworLyogSGlkZSBQUk9DRVNTLiAgKi8KKworc3RhdGlj IHZvaWQKK3plX2hpZGVfcHJvY2VzcyAocHJvY2Vzc19pbmZvICpwcm9jZXNzKQoreworICBnZGJf YXNzZXJ0IChwcm9jZXNzICE9IG51bGxwdHIpOworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqcHJp diA9IHByb2Nlc3MtPnByaXY7CisKKyAgZ2RiX2Fzc2VydCAocHJpdiAhPSBudWxscHRyKTsKKyAg c3dpdGNoIChwcml2LT5zdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9QUk9DRVNTX0hJRERFTjoK KyAgICAgIHJldHVybjsKKworICAgIGNhc2UgWkVfUFJPQ0VTU19WSVNJQkxFOgorICAgICAgLyog RklYTUU6IHJlcG9ydCBzdGF0ZSBjaGFuZ2UKKworCSBTZXQgcHJpdi0+c3RhdHVzIGFuZCByZXBv cnQgdGhlIG5ldyB2aXNpYmlsaXR5IHRvIEdEQi4gICovCisgICAgICBwcml2LT5zdGF0ZSA9IFpF X1BST0NFU1NfSElEREVOOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnRlcm5hbF9lcnJv ciAoXygidW5rbm93biBwcm9jZXNzIHN0YXRlIikpOworfQorCisvKiBBdHRhY2ggdG8gREVWSUNF IGFuZCBjcmVhdGUgYSBoaWRkZW4gcHJvY2VzcyBmb3IgaXQuCisKKyAgIE1vZGlmaWVzIERFVklD RSBhcyBhIHNpZGUtZWZmZWN0LgorICAgUmV0dXJucyB0aGUgY3JlYXRlZCBwcm9jZXNzIG9yIG51 bGxwdHIgaWYgREVWSUNFIGRvZXMgbm90IHN1cHBvcnQgZGVidWcuICAqLworCitzdGF0aWMgcHJv Y2Vzc19pbmZvICoKK3plX2F0dGFjaCAoemVfZGV2aWNlX2luZm8gKmRldmljZSkKK3sKKyAgZ2Ri X2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgIGlmIChkZXZpY2UtPnNlc3Npb24gIT0g bnVsbHB0cikKKyAgICBlcnJvciAoXygiQWxyZWFkeSBhdHRhY2hlZCB0byAlcy4iKSwgZGV2aWNl LT5wcm9wZXJ0aWVzLm5hbWUpOworCisgIGRldmljZS0+ZGVidWdfYXR0YWNoX3N0YXRlID0gemV0 RGVidWdBdHRhY2ggKGRldmljZS0+aGFuZGxlLCAmZGV2aWNlLT5jb25maWcsCisJCQkJCSAgICAg ICAmZGV2aWNlLT5zZXNzaW9uKTsKKyAgc3dpdGNoIChkZXZpY2UtPmRlYnVnX2F0dGFjaF9zdGF0 ZSkKKyAgICB7CisgICAgY2FzZSBaRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgIGlmIChkZXZpY2Ut PnNlc3Npb24gPT0gbnVsbHB0cikKKwllcnJvciAoXygiQmFkIGhhbmRsZSByZXR1cm5lZCBieSB6 ZXREZWJ1Z0F0dGFjaCBvbiAlcy4iKSwKKwkgICAgICAgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUp OworCisgICAgICByZXR1cm4gemVfYWRkX3Byb2Nlc3MgKGRldmljZSwgWkVfUFJPQ0VTU19ISURE RU4pOworCisgICAgY2FzZSBaRV9SRVNVTFRfTk9UX1JFQURZOgorICAgICAgLyogV2UncmUgdG9v IGVhcmx5LiAgVGhlIExldmVsLVplcm8gdXNlci1tb2RlIGRyaXZlciBoYXMgbm90IGJlZW4KKwkg aW5pdGlhbGl6ZWQsIHlldC4gICovCisgICAgICBlcnJvciAoXygiQXR0ZW1wdGluZyB0byBhdHRh Y2ggdG9vIGVhcmx5IHRvICVzLiIpLAorCSAgICAgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUpOwor CisgICAgY2FzZSBaRV9SRVNVTFRfRVJST1JfVU5TVVBQT1JURURfRkVBVFVSRToKKyAgICAgIC8q IE5vdCBhbGwgc3ViLWRldmljZXMgc3VwcG9ydCBhdHRhY2hpbmcgdG8gdGhlbS4gICovCisgICAg ICBkcHJpbnRmICgiQXR0YWNoIG5vdCBzdXBwb3J0ZWQgb24gJXMiLCBkZXZpY2UtPnByb3BlcnRp ZXMubmFtZSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGNhc2UgWkVfUkVTVUxUX0VS Uk9SX05PVF9BVkFJTEFCTEU6CisgICAgICAvKiBTb21lb25lIGVsc2UgaXMgYWxyZWFkeSBhdHRh Y2hlZC4gIFRoaXMgY291bGQgYmUgdXMgaWYgd2UgYWxyZWFkeQorCSBhdHRhY2hlZCB0byBzb21l IG90aGVyIHN1Yi1kZXZpY2UgaW4gdGhpcyBkZXZpY2UgdHJlZS4gICovCisgICAgICBlcnJvciAo XygiU29tZW9uZSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvICVzLiIpLAorCSAgICAgZGV2aWNlLT5w cm9wZXJ0aWVzLm5hbWUpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yIChfKCJGYWlsZWQg dG8gYXR0YWNoIHRvICVzICgleCkuIiksIGRldmljZS0+cHJvcGVydGllcy5uYW1lLAorCSAgICAg ZGV2aWNlLT5kZWJ1Z19hdHRhY2hfc3RhdGUpOworICAgIH0KK30KKworLyogRGV0YWNoIGZyb20g REVWSUNFLiAgKi8KKworc3RhdGljIHZvaWQKK3plX2RldGFjaCAoemVfZGV2aWNlX2luZm8gKmRl dmljZSkKK3sKKyAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgIHpldF9kZWJ1 Z19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24gPSBkZXZpY2UtPnNlc3Npb247CisgIGlmIChzZXNz aW9uID09IG51bGxwdHIpCisgICAgZXJyb3IgKF8oIkFscmVhZHkgZGV0YWNoZWQgZnJvbSAlcy4i KSwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUpOworCisgIGRwcmludGYgKCJkZXZpY2UgJWx1PSVz IiwgZGV2aWNlLT5vcmRpbmFsLCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSk7CisKKyAgemVfcmVz dWx0X3Qgc3RhdHVzICA9IHpldERlYnVnRGV0YWNoIChzZXNzaW9uKTsKKyAgc3dpdGNoIChzdGF0 dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxUX0VSUk9SX0RFVklDRV9MT1NUOgorICAgIGNh c2UgWkVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICBkZXZpY2UtPnNlc3Npb24gPSBudWxscHRyOwor ICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKF8oIkZhaWxlZCB0byBk ZXRhY2ggZnJvbSAlcyAoJXgpLiIpLCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSwKKwkgICAgIHN0 YXR1cyk7CisgICAgfQorfQorCisvKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBkZXRhY2ggcmVh c29uIHN0cmluZy4gICovCisKK3N0YXRpYyBzdGQ6OnN0cmluZworemVfZGV0YWNoX3JlYXNvbl9z dHIgKHpldF9kZWJ1Z19kZXRhY2hfcmVhc29uX3QgcmVhc29uKQoreworICBzd2l0Y2ggKHJlYXNv bikKKyAgICB7CisgICAgY2FzZSBaRVRfREVCVUdfREVUQUNIX1JFQVNPTl9JTlZBTElEOgorICAg ICAgcmV0dXJuIHN0ZDo6c3RyaW5nIChfKCJpbnZhbGlkIikpOworCisgICAgY2FzZSBaRVRfREVC VUdfREVUQUNIX1JFQVNPTl9IT1NUX0VYSVQ6CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcgKF8o InRoZSBob3N0IHByb2Nlc3MgZXhpdGVkIikpOworICAgIH0KKworICByZXR1cm4gc3RkOjpzdHJp bmcgKF8oInVua25vd24iKSk7Cit9CisKKy8qIFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIG1vZHVs ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3JtYXQgc3RyaW5nLiAgKi8KKworc3RhdGljIHN0ZDo6c3Ry aW5nCit6ZV9kZWJ1Z19pbmZvX2Zvcm1hdF9zdHIgKHpldF9tb2R1bGVfZGVidWdfaW5mb19mb3Jt YXRfdCBmb3JtYXQpCit7CisgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIFpFVF9N T0RVTEVfREVCVUdfSU5GT19GT1JNQVRfRUxGX0RXQVJGOgorICAgICAgcmV0dXJuIHN0ZDo6c3Ry aW5nIChfKCJEV0FSRiIpKTsKKyAgICB9CisKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nIChfKCJ1bmtu b3duIikpOworfQorCisvKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBldmVudCBzdHJpbmcuICAq LworCitzdGF0aWMgc3RkOjpzdHJpbmcKK3plX2V2ZW50X3N0ciAoY29uc3QgemV0X2RlYnVnX2V2 ZW50X3QgJmV2ZW50KQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworCisgIHN3aXRj aCAoZXZlbnQudHlwZSkKKyAgICB7CisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9JTlZB TElEOgorICAgICAgc3N0cmVhbSA8PCAiaW52YWxpZCI7CisgICAgICByZXR1cm4gc3N0cmVhbS5z dHIgKCk7CisKKyAgICBjYXNlIFpFVF9ERUJVR19FVkVOVF9UWVBFX0RFVEFDSEVEOgorICAgICAg c3N0cmVhbSA8PCAiZGV0YWNoZWQsIHJlYXNvbj0iCisJICAgICAgPDwgemVfZGV0YWNoX3JlYXNv bl9zdHIgKGV2ZW50LmluZm8uZGV0YWNoZWQucmVhc29uKTsKKyAgICAgIHJldHVybiBzc3RyZWFt LnN0ciAoKTsKKworICAgIGNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZUEVfUFJPQ0VTU19FTlRSWToK KyAgICAgIHNzdHJlYW0gPDwgInByb2Nlc3MgZW50cnkiOworICAgICAgcmV0dXJuIHNzdHJlYW0u c3RyICgpOworCisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9QUk9DRVNTX0VYSVQ6Cisg ICAgICBzc3RyZWFtIDw8ICJwcm9jZXNzIGV4aXQiOworICAgICAgcmV0dXJuIHNzdHJlYW0uc3Ry ICgpOworCisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9NT0RVTEVfTE9BRDoKKyAgICAg IHNzdHJlYW0gPDwgIm1vZHVsZSBsb2FkLCBmb3JtYXQ9IgorCSAgICAgIDw8IHplX2RlYnVnX2lu Zm9fZm9ybWF0X3N0ciAoZXZlbnQuaW5mby5tb2R1bGUuZm9ybWF0KQorCSAgICAgIDw8ICIsIG1v ZHVsZT1bIiA8PCBzdGQ6OmhleCA8PCBldmVudC5pbmZvLm1vZHVsZS5tb2R1bGVCZWdpbgorCSAg ICAgIDw8ICI7ICIgPDwgc3RkOjpoZXggPDwgZXZlbnQuaW5mby5tb2R1bGUubW9kdWxlRW5kCisJ ICAgICAgPDwgIiksIGFkZHI9IiA8PCBzdGQ6OmhleCA8PCBldmVudC5pbmZvLm1vZHVsZS5sb2Fk CisJICAgICAgPDwgIiwgbmVlZC1hY2s6ICIKKwkgICAgICA8PCAoKGV2ZW50LmZsYWdzICYgWkVU X0RFQlVHX0VWRU5UX0ZMQUdfTkVFRF9BQ0spICE9IDApOworICAgICAgcmV0dXJuIHNzdHJlYW0u c3RyICgpOworCisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9NT0RVTEVfVU5MT0FEOgor ICAgICAgc3N0cmVhbSA8PCAibW9kdWxlIHVubG9hZCwgZm9ybWF0PSIKKwkgICAgICA8PCB6ZV9k ZWJ1Z19pbmZvX2Zvcm1hdF9zdHIgKGV2ZW50LmluZm8ubW9kdWxlLmZvcm1hdCkKKwkgICAgICA8 PCAiLCBtb2R1bGU9WyIgPDwgc3RkOjpoZXggPDwgZXZlbnQuaW5mby5tb2R1bGUubW9kdWxlQmVn aW4KKwkgICAgICA8PCAiOyAiIDw8IHN0ZDo6aGV4IDw8IGV2ZW50LmluZm8ubW9kdWxlLm1vZHVs ZUVuZAorCSAgICAgIDw8ICIpLCBhZGRyPSIgPDwgc3RkOjpoZXggPDwgZXZlbnQuaW5mby5tb2R1 bGUubG9hZDsKKyAgICAgIHJldHVybiBzc3RyZWFtLnN0ciAoKTsKKworICAgIGNhc2UgWkVUX0RF QlVHX0VWRU5UX1RZUEVfVEhSRUFEX1NUT1BQRUQ6CisgICAgICBzc3RyZWFtIDw8ICJ0aHJlYWQg c3RvcHBlZCwgdGhyZWFkPSIKKwkgICAgICA8PCB6ZV90aHJlYWRfaWRfc3RyIChldmVudC5pbmZv LnRocmVhZC50aHJlYWQpOworICAgICAgcmV0dXJuIHNzdHJlYW0uc3RyICgpOworCisgICAgY2Fz ZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9USFJFQURfVU5BVkFJTEFCTEU6CisgICAgICBzc3RyZWFt IDw8ICJ0aHJlYWQgdW5hdmFpbGFibGUsIHRocmVhZD0iCisJICAgICAgPDwgemVfdGhyZWFkX2lk X3N0ciAoZXZlbnQuaW5mby50aHJlYWQudGhyZWFkKTsKKyAgICAgIHJldHVybiBzc3RyZWFtLnN0 ciAoKTsKKyAgICB9CisKKyAgc3N0cmVhbSA8PCAidW5rbm93biwgY29kZT0iIDw8IGV2ZW50LnR5 cGU7CisgIHJldHVybiBzc3RyZWFtLnN0ciAoKTsKK30KKworLyogQWNrbm93bGVkZ2UgYW4gZXZl bnQsIGlmIG5lY2Vzc2FyeS4gICovCisKK3N0YXRpYyB2b2lkCit6ZV9hY2tfZXZlbnQgKGNvbnN0 IHplX2RldmljZV9pbmZvICZkZXZpY2UsIGNvbnN0IHpldF9kZWJ1Z19ldmVudF90ICZldmVudCkK K3sKKyAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgZXZlbnRzIHRoYXQgZG8gbm90IG5l ZWQgYWNrbm93bGVkZ2luZy4gICovCisgIGlmICgoZXZlbnQuZmxhZ3MgJiBaRVRfREVCVUdfRVZF TlRfRkxBR19ORUVEX0FDSykgPT0gMCkKKyAgICByZXR1cm47CisKKyAgemVfcmVzdWx0X3Qgc3Rh dHVzID0gemV0RGVidWdBY2tub3dsZWRnZUV2ZW50IChkZXZpY2Uuc2Vzc2lvbiwgJmV2ZW50KTsK KyAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxUX1NVQ0NFU1M6Cisg ICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygiZXJyb3IgYWNrbm93 bGVkZ2luZyBldmVudDogJXM6ICV4LiIpLAorCSAgICAgemVfZXZlbnRfc3RyIChldmVudCkuY19z dHIgKCksIHN0YXR1cyk7CisgICAgfQorfQorCisvKiBDbGVhciBUUCdzIHJlc3VtZSBzdGF0ZS4g ICovCisKK3N0YXRpYyB2b2lkCit6ZV9jbGVhcl9yZXN1bWVfc3RhdGUgKHRocmVhZF9pbmZvICp0 cCkKK3sKKyAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgZ2RiX2Fz c2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICB6ZXRwLT5yZXN1bWVfc3RhdGUgPSBaRV9USFJF QURfUkVTVU1FX05PTkU7Cit9CisKKy8qIFNldCBUUCdzIHJlc3VtZSBzdGF0ZSBmcm9tIFJLSU5E LiAgKi8KKworc3RhdGljIHZvaWQKK3plX3NldF9yZXN1bWVfc3RhdGUgKHRocmVhZF9pbmZvICp0 cCwgcmVzdW1lX2tpbmQgcmtpbmQpCit7CisgIHplX3RocmVhZF9pbmZvICp6ZXRwID0gemVfdGhy ZWFkICh0cCk7CisgIGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKyAgc3dpdGNoIChy a2luZCkKKyAgICB7CisgICAgY2FzZSByZXN1bWVfY29udGludWU6CisgICAgICB6ZXRwLT5yZXN1 bWVfc3RhdGUgPSBaRV9USFJFQURfUkVTVU1FX1JVTjsKKyAgICAgIHJldHVybjsKKworICAgIGNh c2UgcmVzdW1lX3N0ZXA6CisgICAgICB6ZXRwLT5yZXN1bWVfc3RhdGUgPSBaRV9USFJFQURfUkVT VU1FX1NURVA7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIHJlc3VtZV9zdG9wOgorICAgICAg emV0cC0+cmVzdW1lX3N0YXRlID0gWkVfVEhSRUFEX1JFU1VNRV9TVE9QOworICAgICAgcmV0dXJu OworICAgIH0KKworICBpbnRlcm5hbF9lcnJvciAoXygiYmFkIHJlc3VtZSBraW5kOiAlZC4iKSwg cmtpbmQpOworfQorCisvKiBSZXR1cm4gVFAncyByZXN1bWUgc3RhdGUuICAqLworCitzdGF0aWMg ZW51bSB6ZV90aHJlYWRfcmVzdW1lX3N0YXRlX3QKK3plX3Jlc3VtZV9zdGF0ZSAoY29uc3QgdGhy ZWFkX2luZm8gKnRwKQoreworICBjb25zdCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVh ZCAodHApOworICBpZiAoemV0cCA9PSBudWxscHRyKQorICAgIHJldHVybiBaRV9USFJFQURfUkVT VU1FX05PTkU7CisKKyAgcmV0dXJuIHpldHAtPnJlc3VtZV9zdGF0ZTsKK30KKworLyogUmV0dXJu IFRQJ3MgZXhlY3V0aW9uIHN0YXRlLiAgKi8KKworc3RhdGljIGVudW0gemVfdGhyZWFkX2V4ZWNf c3RhdGVfdAoremVfZXhlY19zdGF0ZSAoY29uc3QgdGhyZWFkX2luZm8gKnRwKQoreworICBjb25z dCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworICBpZiAoemV0cCA9PSBu dWxscHRyKQorICAgIHJldHVybiBaRV9USFJFQURfU1RBVEVfVU5LTk9XTjsKKworICByZXR1cm4g emV0cC0+ZXhlY19zdGF0ZTsKK30KKworLyogUmV0dXJuIHdoZXRoZXIgVFAgaGFzIGEgc3RvcCBl eGVjdXRpb24gc3RhdGUuICAqLworCitzdGF0aWMgYm9vbAoremVfdGhyZWFkX3N0b3BwZWQgKGNv bnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgemVfdGhyZWFkX2V4ZWNfc3RhdGVfdCBzdGF0ZSA9 IHplX2V4ZWNfc3RhdGUgKHRwKTsKKworICByZXR1cm4gKChzdGF0ZSA9PSBaRV9USFJFQURfU1RB VEVfU1RPUFBFRCkKKwkgIHx8IChzdGF0ZSA9PSBaRV9USFJFQURfU1RBVEVfSEVMRCkKKwkgIHx8 IChzdGF0ZSA9PSBaRV9USFJFQURfU1RBVEVfUEFVU0VEKSk7Cit9CisKKy8qIFJldHVybiB3aGV0 aGVyIFRQIGhhcyBhIHBlbmRpbmcgZXZlbnQuICAqLworCitzdGF0aWMgYm9vbAoremVfaGFzX3dh aXRzdGF0dXMgKGNvbnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgY29uc3QgemVfdGhyZWFkX2lu Zm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikKKyAgICBy ZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuICh6ZXRwLT53YWl0c3RhdHVzLmtpbmQgKCkgIT0gVEFS R0VUX1dBSVRLSU5EX0lHTk9SRSk7Cit9CisKKy8qIFJldHVybiB3aGV0aGVyIFRQIGhhcyBhIHBl bmRpbmcgcHJpb3JpdHkgZXZlbnQuICAqLworCitzdGF0aWMgYm9vbAoremVfaGFzX3ByaW9yaXR5 X3dhaXRzdGF0dXMgKGNvbnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgY29uc3QgemVfdGhyZWFk X2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikKKyAg ICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoICh6ZXRwLT53YWl0c3RhdHVzLmtpbmQgKCkpCisg ICAgeworICAgIGNhc2UgVEFSR0VUX1dBSVRLSU5EX0lHTk9SRToKKyAgICBjYXNlIFRBUkdFVF9X QUlUS0lORF9VTkFWQUlMQUJMRToKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgVEFS R0VUX1dBSVRLSU5EX1NUT1BQRUQ6CisgICAgICAvKiBJZiB0aGlzIHRocmVhZCB3YXMgc3RvcHBl ZCB2aWEgYW4gaW50ZXJydXB0LCBpdCBpcyBhbiBpbnRlcmVzdGluZworCSBjYXNlIGlmIEdEQiB3 YW50ZWQgaXQgc3RvcHBlZCB3aXRoIGEgc3RvcCByZXN1bWUgcmVxdWVzdC4gICovCisgICAgICBp ZiAoKHpldHAtPnN0b3BfcmVhc29uID09IFRBUkdFVF9TVE9QUEVEX0JZX05PX1JFQVNPTikKKwkg ICYmICh6ZXRwLT53YWl0c3RhdHVzLnNpZyAoKSA9PSBHREJfU0lHTkFMX1RSQVApKQorCXJldHVy biAoemV0cC0+cmVzdW1lX3N0YXRlID09IFpFX1RIUkVBRF9SRVNVTUVfU1RPUCk7CisKKyAgICAg IC8qIElmIHRoaXMgdGhyZWFkIHN0b3BwZWQgc3B1cmlvdXNseSwgaXQgaXMgbm90IGludGVyZXN0 aW5nLiAgKi8KKyAgICAgIGlmICgoemV0cC0+c3RvcF9yZWFzb24gPT0gVEFSR0VUX1NUT1BQRURf QllfTk9fUkVBU09OKQorCSAgJiYgKHpldHAtPndhaXRzdGF0dXMuc2lnICgpID09IEdEQl9TSUdO QUxfMCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1 bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKKy8qIFJldHVybiBUUCdzIHdhaXRz dGF0dXMgYW5kIGNsZWFyIGl0IGluIFRQLiAgKi8KKworc3RhdGljIHRhcmdldF93YWl0c3RhdHVz Cit6ZV9tb3ZlX3dhaXRzdGF0dXMgKHRocmVhZF9pbmZvICp0cCkKK3sKKyAgemVfdGhyZWFkX2lu Zm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikKKyAgICBy ZXR1cm4ge307CisKKyAgdGFyZ2V0X3dhaXRzdGF0dXMgc3RhdHVzID0gemV0cC0+d2FpdHN0YXR1 czsKKyAgemV0cC0+d2FpdHN0YXR1cy5zZXRfaWdub3JlICgpOworCisgIHJldHVybiBzdGF0dXM7 Cit9CisKKy8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGRl dmljZSBjb3JyZXNwb25kaW5nIHRvCisgICBQUk9DRVNTLiAgKi8KKworc3RhdGljIHZvaWQKK3pl X2RldmljZV9kZXRhY2hlZCAocHJvY2Vzc19pbmZvICpwcm9jZXNzLCB6ZXRfZGVidWdfZGV0YWNo X3JlYXNvbl90IHJlYXNvbikKK3sKKyAgZ2RiX2Fzc2VydCAocHJvY2VzcyAhPSBudWxscHRyKTsK KworICAvKiBXZSBtb2RlbCBnZXR0aW5nIGRldGFjaGVkIGZyb20gYSBkZXZpY2UgYXMgdGhlIGNv cnJlc3BvbmRpbmcgZGV2aWNlIHByb2Nlc3MKKyAgICAgZXhpdGluZyB3aXRoIHRoZSBkZXRhY2gg cmVhc29uIGFzIGV4aXQgc3RhdHVzLgorCisgICAgIEluIHRoZSBmaXJzdCBzdGVwLCB3ZSBtYXJr IGFsbCB0aHJlYWRzIG9mIHRoYXQgcHJvY2VzcyBleGl0ZWQuICBXZSBhbHJlYWR5CisgICAgIHVz ZSB0aGUgcHJvY2VzcyBleGl0IHdhaXQgc3RhdHVzIGFzIGFsbCB0aHJlYWRzIHdpbGwgZXhpdCB0 b2dldGhlci4KKworICAgICBJbiB0aGUgc2Vjb25kIHN0ZXAsIHdoZW4gb25lIG9mIHRob3NlIHRo cmVhZHMgZ2V0cyBzZWxlY3RlZCBmb3IgcmVwb3J0aW5nCisgICAgIGl0cyBldmVudCwgd2Ugd2ls bCByZW1vdmUgdGhlIHByb2Nlc3MgYXMgcGFydCBvZiB0aGUgcmVwb3J0aW5nIGZsb3cuICAqLwor CisgIHByb2Nlc3MtPmZvcl9lYWNoX3RocmVhZCAoW3JlYXNvbl0gKHRocmVhZF9pbmZvICp0cCkK KyAgICB7CisgICAgICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworICAg ICAgZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICAgICAgemV0cC0+d2FpdHN0YXR1 cy5zZXRfZXhpdGVkICgoaW50KSByZWFzb24pOworICAgIH0pOworfQorCisvKiBGaW5kIHRoZSBy ZWdzZXQgY29udGFpbmluZyBSRUdOTyBvbiBERVZJQ0Ugb3IgdGhyb3cgaWYgbm90IGZvdW5kLiAg Ki8KKworc3RhdGljIHplX3JlZ3NldF9pbmZvCit6ZV9maW5kX3JlZ3NldCAoY29uc3QgemVfZGV2 aWNlX2luZm8gJmRldmljZSwgbG9uZyByZWdubykKK3sKKyAgZm9yIChjb25zdCB6ZV9yZWdzZXRf aW5mbyAmcmVnc2V0IDogZGV2aWNlLnJlZ3NldHMpCisgICAgeworICAgICAgaWYgKHJlZ25vIDwg cmVnc2V0LmJlZ2luKQorCWNvbnRpbnVlOworCisgICAgICBpZiAocmVnc2V0LmVuZCA8PSByZWdu bykKKwljb250aW51ZTsKKworICAgICAgcmV0dXJuIHJlZ3NldDsKKyAgICB9CisKKyAgZXJyb3Ig KF8oIk5vIHJlZ2lzdGVyICVsZCBvbiAlcy4iKSwgcmVnbm8sIGRldmljZS5wcm9wZXJ0aWVzLm5h bWUpOworfQorCisvKiBGZXRjaCBhbGwgcmVnaXN0ZXJzIGZvciBUSFJFQUQgb24gREVWSUNFIGlu dG8gUkVHQ0FDSEUuICAqLworCitzdGF0aWMgdm9pZAoremVfZmV0Y2hfYWxsX3JlZ2lzdGVycyAo Y29uc3QgemVfZGV2aWNlX2luZm8gJmRldmljZSwKKwkJCWNvbnN0IHplX2RldmljZV90aHJlYWRf dCB0aHJlYWQsCisJCQlyZWdjYWNoZSAqcmVnY2FjaGUpCit7CisgIGZvciAoY29uc3QgemVfcmVn c2V0X2luZm8gJnJlZ3NldCA6IGRldmljZS5yZWdzZXRzKQorICAgIHsKKyAgICAgIGdkYl9hc3Nl cnQgKHJlZ3NldC5iZWdpbiA8PSByZWdzZXQuZW5kKTsKKyAgICAgIGxvbmcgbG5yZWdzID0gcmVn c2V0LmVuZCAtIHJlZ3NldC5iZWdpbjsKKworICAgICAgZ2RiX2Fzc2VydCAobG5yZWdzIDwgVUlO VDMyX01BWCk7CisgICAgICB1aW50MzJfdCBucmVncyA9ICh1aW50MzJfdCkgbG5yZWdzOworCisg ICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIgKHJlZ3NldC5zaXplICogbnJlZ3MpOwor ICAgICAgemVfcmVzdWx0X3Qgc3RhdHVzCisJPSB6ZXREZWJ1Z1JlYWRSZWdpc3RlcnMgKGRldmlj ZS5zZXNzaW9uLCB0aHJlYWQsIHJlZ3NldC50eXBlLCAwLAorCQkJCSBucmVncywgYnVmZmVyLmRh dGEgKCkpOworICAgICAgc3dpdGNoIChzdGF0dXMpCisJeworCWNhc2UgWkVfUkVTVUxUX1NVQ0NF U1M6CisJY2FzZSBaRV9SRVNVTFRfRVJST1JfTk9UX0FWQUlMQUJMRToKKwkgIHsKKwkgICAgc2l6 ZV90IG9mZnNldCA9IDA7CisJICAgIGxvbmcgcmVnID0gcmVnc2V0LmJlZ2luOworCisJICAgIGZv ciAoOyByZWcgPCByZWdzZXQuZW5kOyByZWcgKz0gMSwgb2Zmc2V0ICs9IHJlZ3NldC5zaXplKQor CSAgICAgIHsKKwkJaWYgKHN0YXR1cyA9PSBaRV9SRVNVTFRfU1VDQ0VTUykKKwkJICBzdXBwbHlf cmVnaXN0ZXIgKHJlZ2NhY2hlLCByZWcsICZidWZmZXJbb2Zmc2V0XSk7CisJCWVsc2UKKwkJICBz dXBwbHlfcmVnaXN0ZXIgKHJlZ2NhY2hlLCByZWcsIG51bGxwdHIpOworCSAgICAgIH0KKwkgIH0K KwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHdhcm5pbmcgKF8oIkVycm9yICV4IHJlYWRpbmcg cmVnc2V0ICUiIFBSSXUzMiAiIGZvciAlcyBvbiAlcy4iKSwKKwkJICAgc3RhdHVzLCByZWdzZXQu dHlwZSwgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwKKwkJICAgZGV2aWNlLnBy b3BlcnRpZXMubmFtZSk7CisKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIEZldGNoIHJl Z2lzdGVyIFJFR05PIGZvciBUSFJFQUQgb24gREVWSUNFIGludG8gUkVHQ0FDSEUuICAqLworCitz dGF0aWMgdm9pZAoremVfZmV0Y2hfcmVnaXN0ZXIgKGNvbnN0IHplX2RldmljZV9pbmZvICZkZXZp Y2UsCisJCSAgIGNvbnN0IHplX2RldmljZV90aHJlYWRfdCB0aHJlYWQsCisJCSAgIHJlZ2NhY2hl ICpyZWdjYWNoZSwgbG9uZyByZWdubykKK3sKKyAgemVfcmVnc2V0X2luZm8gcmVnc2V0ID0gemVf ZmluZF9yZWdzZXQgKGRldmljZSwgcmVnbm8pOworCisgIGdkYl9hc3NlcnQgKHJlZ3NldC5iZWdp biA8PSByZWdubyk7CisgIGxvbmcgbHJzbm8gPSByZWdubyAtIHJlZ3NldC5iZWdpbjsKKworICBn ZGJfYXNzZXJ0IChscnNubyA8PSBVSU5UMzJfTUFYKTsKKyAgdWludDMyX3QgcnNubyA9ICh1aW50 MzJfdCkgbHJzbm87CisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyIChyZWdzZXQuc2l6 ZSk7CisgIHplX3Jlc3VsdF90IHN0YXR1cworICAgID0gemV0RGVidWdSZWFkUmVnaXN0ZXJzIChk ZXZpY2Uuc2Vzc2lvbiwgdGhyZWFkLCByZWdzZXQudHlwZSwgcnNubywgMSwKKwkJCSAgICAgYnVm ZmVyLmRhdGEgKCkpOworICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgY2FzZSBaRV9SRVNV TFRfU1VDQ0VTUzoKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnY2FjaGUsIHJlZ25vLCBidWZm ZXIuZGF0YSAoKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVfUkVTVUxUX0VSUk9SX05P VF9BVkFJTEFCTEU6CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2NhY2hlLCByZWdubywgbnVs bHB0cik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB3YXJuaW5nIChfKCJF cnJvciAleCByZWFkaW5nIHJlZ2lzdGVyICVsZCAocmVnc2V0ICUiIFBSSXUzMgorCQkgIikgZm9y ICVzIG9uICVzLiIpLCBzdGF0dXMsIHJlZ25vLCByZWdzZXQudHlwZSwKKwkgICAgICAgemVfdGhy ZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLnByb3BlcnRpZXMubmFtZSk7Cisg ICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFN0b3JlIGFsbCByZWdpc3RlcnMgZm9yIFRIUkVB RCBvbiBERVZJQ0UgZnJvbSBSRUdDQUNIRS4gICovCisKK3N0YXRpYyB2b2lkCit6ZV9zdG9yZV9h bGxfcmVnaXN0ZXJzIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAmZGV2aWNlLAorCQkJY29uc3QgemVf ZGV2aWNlX3RocmVhZF90IHRocmVhZCwKKwkJCXJlZ2NhY2hlICpyZWdjYWNoZSkKK3sKKyAgZm9y IChjb25zdCB6ZV9yZWdzZXRfaW5mbyAmcmVnc2V0IDogZGV2aWNlLnJlZ3NldHMpCisgICAgewor ICAgICAgaWYgKCFyZWdzZXQuaXNfd3JpdGVhYmxlKQorCWNvbnRpbnVlOworCisgICAgICBnZGJf YXNzZXJ0IChyZWdzZXQuYmVnaW4gPD0gcmVnc2V0LmVuZCk7CisgICAgICBsb25nIGxucmVncyA9 IHJlZ3NldC5lbmQgLSByZWdzZXQuYmVnaW47CisKKyAgICAgIGdkYl9hc3NlcnQgKGxucmVncyA8 IFVJTlQzMl9NQVgpOworICAgICAgdWludDMyX3QgbnJlZ3MgPSAodWludDMyX3QpIGxucmVnczsK KworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyIChyZWdzZXQuc2l6ZSAqIG5yZWdz KTsKKyAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgbG9uZyByZWcgPSByZWdzZXQuYmVn aW47CisgICAgICBmb3IgKDsgcmVnIDwgcmVnc2V0LmVuZDsgcmVnICs9IDEsIG9mZnNldCArPSBy ZWdzZXQuc2l6ZSkKKwljb2xsZWN0X3JlZ2lzdGVyIChyZWdjYWNoZSwgcmVnLCAmYnVmZmVyW29m ZnNldF0pOworCisgICAgICB6ZV9yZXN1bHRfdCBzdGF0dXMKKwk9IHpldERlYnVnV3JpdGVSZWdp c3RlcnMgKGRldmljZS5zZXNzaW9uLCB0aHJlYWQsIHJlZ3NldC50eXBlLCAwLAorCQkJCSAgbnJl Z3MsIGJ1ZmZlci5kYXRhICgpKTsKKyAgICAgIHN3aXRjaCAoc3RhdHVzKQorCXsKKwljYXNlIFpF X1JFU1VMVF9TVUNDRVNTOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZXJyb3IgKF8oIkVy cm9yICV4IHdyaXRpbmcgcmVnc2V0ICUiIFBSSXUzMiAiIGZvciAlcyBvbiAlcy4iKSwKKwkJIHN0 YXR1cywgcmVnc2V0LnR5cGUsIHplX3RocmVhZF9pZF9zdHIgKHRocmVhZCkuY19zdHIgKCksCisJ CSBkZXZpY2UucHJvcGVydGllcy5uYW1lKTsKKwl9CisgICAgfQorfQorCisvKiBTdG9yZSByZWdp c3RlciBSRUdOTyBmb3IgVEhSRUFEIG9uIERFVklDRSBmcm9tIFJFR0NBQ0hFLiAgKi8KKworc3Rh dGljIHZvaWQKK3plX3N0b3JlX3JlZ2lzdGVyIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAmZGV2aWNl LAorCQkgICBjb25zdCB6ZV9kZXZpY2VfdGhyZWFkX3QgdGhyZWFkLAorCQkgICByZWdjYWNoZSAq cmVnY2FjaGUsIGxvbmcgcmVnbm8pCit7CisgIHplX3JlZ3NldF9pbmZvIHJlZ3NldCA9IHplX2Zp bmRfcmVnc2V0IChkZXZpY2UsIHJlZ25vKTsKKworICBpZiAoIXJlZ3NldC5pc193cml0ZWFibGUp CisgICAgZXJyb3IgKF8oIldyaXRpbmcgcmVhZC1vbmx5IHJlZ2lzdGVyICVsZCAocmVnc2V0ICUi IFBSSXUzMgorCSAgICAgIikgZm9yICVzIG9uICVzLiIpLCByZWdubywgcmVnc2V0LnR5cGUsCisJ ICAgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLnByb3BlcnRpZXMu bmFtZSk7CisKKyAgZ2RiX2Fzc2VydCAocmVnc2V0LmJlZ2luIDw9IHJlZ25vKTsKKyAgbG9uZyBs cnNubyA9IHJlZ25vIC0gcmVnc2V0LmJlZ2luOworCisgIGdkYl9hc3NlcnQgKGxyc25vIDw9IFVJ TlQzMl9NQVgpOworICB1aW50MzJfdCByc25vID0gKHVpbnQzMl90KSBscnNubzsKKworICBzdGQ6 OnZlY3Rvcjx1aW50OF90PiBidWZmZXIgKHJlZ3NldC5zaXplKTsKKyAgY29sbGVjdF9yZWdpc3Rl ciAocmVnY2FjaGUsIHJlZ25vLCBidWZmZXIuZGF0YSAoKSk7CisKKyAgemVfcmVzdWx0X3Qgc3Rh dHVzCisgICAgPSB6ZXREZWJ1Z1dyaXRlUmVnaXN0ZXJzIChkZXZpY2Uuc2Vzc2lvbiwgdGhyZWFk LCByZWdzZXQudHlwZSwgcnNubywgMSwKKwkJCSAgICAgIGJ1ZmZlci5kYXRhICgpKTsKKyAgc3dp dGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICBi cmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygiRXJyb3IgJXggd3JpdGluZyBy ZWdpc3RlciAlbGQgKHJlZ3NldCAlIiBQUkl1MzIKKwkgICAgICAgIikgZm9yICVzIG9uICVzLiIp LCBzdGF0dXMsICByZWdubywgcmVnc2V0LnR5cGUsCisJICAgICB6ZV90aHJlYWRfaWRfc3RyICh0 aHJlYWQpLmNfc3RyICgpLAorCSAgICAgZGV2aWNlLnByb3BlcnRpZXMubmFtZSk7CisgICAgfQor fQorCisvKiBEaXNjYXJkIFRQJ3MgcmVnY2FjaGUuICAqLworCitzdGF0aWMgdm9pZAoremVfZGlz Y2FyZF9yZWdjYWNoZSAodGhyZWFkX2luZm8gKnRwKQoreworICByZWdjYWNoZSAqcmVnY2FjaGUg PSBnZXRfdGhyZWFkX3JlZ2NhY2hlICh0cCwgLyogZmV0Y2ggPSAqLyBmYWxzZSk7CisgIGdkYl9h c3NlcnQgKHJlZ2NhY2hlICE9IG51bGxwdHIpOworCisgIHJlZ2NhY2hlLT5yZWdpc3RlcnNfdmFs aWQgPSAwOworfQorCisvKiBQcmVwYXJlIGZvciByZXN1bWluZyBUUC4gIFJldHVybiB0cnVlIGlm IFRQIHNob3VsZCBiZSBhY3R1YWxseQorICAgcmVzdW1lZC4gICovCisKK3N0YXRpYyBib29sCit6 ZV9wcmVwYXJlX2Zvcl9yZXN1bWluZyAodGhyZWFkX2luZm8gKnRwKQoreworICB6ZV90aHJlYWRf aW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxw dHIpOworCisgIC8qIFdlIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHRoZXJlIGlz IGEgcHJpb3JpdHkKKyAgICAgd2FpdHN0YXR1cy4gICovCisgIGdkYl9hc3NlcnQgKCF6ZV9oYXNf cHJpb3JpdHlfd2FpdHN0YXR1cyAodHApKTsKKworICAvKiBXaGVuIHdlIGdldCBkZXRhY2hlZCwg d2Ugd2lsbCByZW1vdmUgdGhlIGRldmljZSBidXQgd2Ugd2lsbCBhbHNvIG1hcmsKKyAgICAgZWFj aCB0aHJlYWQgZXhpdGVkLiAgV2Ugc2hvdWxkbid0IHRyeSB0byByZXN1bWUgdGhlbS4gICovCisg IHplX2RldmljZV9pbmZvICpkZXZpY2UgPSB6ZV90aHJlYWRfZGV2aWNlICh0cCk7CisgIGdkYl9h c3NlcnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICB6ZV90aHJlYWRfZXhlY19zdGF0ZV90IHN0 YXRlID0gemV0cC0+ZXhlY19zdGF0ZTsKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2Fz ZSBaRV9USFJFQURfU1RBVEVfUEFVU0VEOgorICAgICAgemV0cC0+ZXhlY19zdGF0ZSA9IFpFX1RI UkVBRF9TVEFURV9TVE9QUEVEOworCisgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgY2FzZSBa RV9USFJFQURfU1RBVEVfU1RPUFBFRDoKKyAgICAgIGRldmljZS0+bnJlc3VtZWQrKzsKKyAgICAg IGlmIChkZXZpY2UtPm5yZXN1bWVkID4gZGV2aWNlLT5udGhyZWFkcykKKwl7CisJICBkZXZpY2Ut Pm5yZXN1bWVkID0gZGV2aWNlLT5udGhyZWFkczsKKwkgIGRwcmludGYgKCJjYXBwaW5nIGRldmlj ZSAlbHUncyBucmVzdW1lZCBhdCAlbGQgKGFsbCkiLAorCQkgICBkZXZpY2UtPm9yZGluYWwsIGRl dmljZS0+bnRocmVhZHMpOworCX0KKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBaRV9U SFJFQURfU1RBVEVfSEVMRDoKKyAgICAgIGdkYl9hc3NlcnRfbm90X3JlYWNoZWQgKCJ0aHJlYWRz IHdpdGggJ2hlbGQnIHN0YXRlIHNob3VsZCAiCisJCQkgICAgICAiaGF2ZSBiZWVuIHR1cm5lZCBp bnRvICdzdG9wcGVkJyIpOworCisgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfVU5BVkFJTEFCTEU6 CisgICAgICBkZXZpY2UtPm5yZXN1bWVkKys7CisgICAgICBpZiAoZGV2aWNlLT5ucmVzdW1lZCA+ IGRldmljZS0+bnRocmVhZHMpCisJeworCSAgZGV2aWNlLT5ucmVzdW1lZCA9IGRldmljZS0+bnRo cmVhZHM7CisJICBkcHJpbnRmICgiY2FwcGluZyBkZXZpY2UgJWx1J3MgbnJlc3VtZWQgYXQgJWxk IChhbGwpIiwKKwkJICAgZGV2aWNlLT5vcmRpbmFsLCBkZXZpY2UtPm50aHJlYWRzKTsKKwl9CisK KyAgICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfUlVOTklORzsKKworICAg ICAgLyogSWdub3JlIHJlc3VtaW5nIHVuYXZhaWxhYmxlIHRocmVhZHMuICAqLworICAgICAgcmV0 dXJuIGZhbHNlOworCisgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfUlVOTklORzoKKyAgICAgIC8q IElnbm9yZSByZXN1bWluZyBhbHJlYWR5IHJ1bm5pbmcgdGhyZWFkcy4gICovCisgICAgICByZXR1 cm4gZmFsc2U7CisKKyAgICBjYXNlIFpFX1RIUkVBRF9TVEFURV9VTktOT1dOOgorICAgICAgd2Fy bmluZyAoXygidGhyZWFkICVzIGhhcyB1bmtub3duIGV4ZWN1dGlvbiAiCisJCSAic3RhdGUiKSwg dHAtPmlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg fQorCisgIGludGVybmFsX2Vycm9yIChfKCJiYWQgZXhlY3V0aW9uIHN0YXRlOiAlZC4iKSwgc3Rh dGUpOworfQorCisvKiBQcmVwYXJlIGZvciBzdG9wcGluZyBUUC4gIFJldHVybiB0cnVlIGlmIFRQ IHNob3VsZCBiZQorICAgYWN0dWFsbHkgc3RvcHBlZCBieSBzZW5kaW5nIGFuIGludGVycnVwdCB0 byB0aGUgdGFyZ2V0LiAgKi8KKworc3RhdGljIGJvb2wKK3plX3ByZXBhcmVfZm9yX3N0b3BwaW5n ICh0aHJlYWRfaW5mbyAqdHApCit7CisgIHplX3RocmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFk ICh0cCk7CisgIGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKyAgLyogV2hlbiB3ZSBn ZXQgZGV0YWNoZWQsIHdlIHdpbGwgcmVtb3ZlIHRoZSBkZXZpY2UgYnV0IHdlIHdpbGwgYWxzbyBt YXJrCisgICAgIGVhY2ggdGhyZWFkIGV4aXRlZC4gIFdlIHNob3VsZG4ndCB0cnkgdG8gc3RvcCB0 aGVtLiAgKi8KKyAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9IHplX3RocmVhZF9kZXZpY2UgKHRw KTsKKyAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgIHplX3RocmVhZF9leGVj X3N0YXRlX3Qgc3RhdGUgPSB6ZXRwLT5leGVjX3N0YXRlOworICBzd2l0Y2ggKHN0YXRlKQorICAg IHsKKyAgICBjYXNlIFpFX1RIUkVBRF9TVEFURV9TVE9QUEVEOgorICAgICAgLyogV2Ugc2lsZW50 bHkgaWdub3JlIGFscmVhZHkgc3RvcHBlZCB0aHJlYWRzLiAgKi8KKyAgICAgIHJldHVybiBmYWxz ZTsKKworICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX0hFTEQ6CisgICAgICBnZGJfYXNzZXJ0X25v dF9yZWFjaGVkICgidGhyZWFkcyB3aXRoICdoZWxkJyBzdGF0ZSBzaG91bGQgIgorCQkJICAgICAg ImhhdmUgYmVlbiB0dXJuZWQgaW50byAnc3RvcHBlZCciKTsKKworICAgIGNhc2UgWkVfVEhSRUFE X1NUQVRFX1BBVVNFRDoKKyAgICAgIC8qIEEgcGF1c2VkIHRocmVhZCBpcyBhbHJlYWR5IHN0b3Bw ZWQuICAqLworICAgICAgemV0cC0+ZXhlY19zdGF0ZSA9IFpFX1RIUkVBRF9TVEFURV9TVE9QUEVE OworICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfVU5BVkFJ TEFCTEU6CisgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfUlVOTklORzoKKyAgICAgIHJldHVybiB0 cnVlOworCisgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfVU5LTk9XTjoKKyAgICAgIHdhcm5pbmcg KF8oInRocmVhZCAlcyBoYXMgdW5rbm93biBleGVjdXRpb24gc3RhdGUiKSwKKwkgICAgICAgdHAt PmlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor CisgIGludGVybmFsX2Vycm9yIChfKCJiYWQgZXhlY3V0aW9uIHN0YXRlOiAlZC4iKSwgc3RhdGUp OworfQorCisvKiBSZXN1bWUgVEhSRUFEIG9uIERFVklDRS4gICovCisKK3N0YXRpYyB2b2lkCit6 ZV9yZXN1bWUgKHplX2RldmljZV9pbmZvICZkZXZpY2UsIHplX2RldmljZV90aHJlYWRfdCB0aHJl YWQpCit7CisgIGRwcmludGYgKCJkZXZpY2UgJWx1PSVzLCB0aHJlYWQ9JXMiLCBkZXZpY2Uub3Jk aW5hbCwKKwkgICBkZXZpY2UucHJvcGVydGllcy5uYW1lLCB6ZV90aHJlYWRfaWRfc3RyICh0aHJl YWQpLmNfc3RyICgpKTsKKworICB6ZV9yZXN1bHRfdCBzdGF0dXMgPSB6ZXREZWJ1Z1Jlc3VtZSAo ZGV2aWNlLnNlc3Npb24sIHRocmVhZCk7CisgIHN3aXRjaCAoc3RhdHVzKQorICAgIHsKKyAgICBj YXNlIFpFX1JFU1VMVF9TVUNDRVNTOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpFX1JFU1VM VF9FUlJPUl9OT1RfQVZBSUxBQkxFOgorICAgICAgLyogSWdub3JlIHRoaXMgaWYgd2UncmUgbm90 IG1vZGVsaW5nIERFVklDRSBhcyBhIHByb2Nlc3MgYW55bW9yZS4gICovCisgICAgICBpZiAoZGV2 aWNlLnByb2Nlc3MgPT0gbnVsbHB0cikKKwlicmVhazsKKworICAgICAgLyogVGhlIHRocmVhZCBp cyBhbHJlYWR5IHJ1bm5pbmcgb3IgdW5hdmFpbGFibGUuCisKKwkgQXNzdW1pbmcgb3VyIHRocmVh ZCBzdGF0ZSB0cmFja2luZyBpcyBjb3JyZWN0LCB0aGUgdGhyZWFkIGlzbid0CisJIHJ1bm5pbmcs IHNvIHdlIGFzc3VtZSBpdCBiZWNhbWUgdW5hdmFpbGFibGUuICBUaGF0IGlzIHN0cmFuZ2UsCisJ IHRvbywgYXMgd2UgaGFkIGl0IHN0b3BwZWQuICAqLworICAgICAgd2FybmluZyAoXygidGhyZWFk ICVzIHVuZXhwZWN0ZWRseSB1bmF2YWlsYWJsZSBvbiAlcy4iKSwKKwkgICAgICAgemVfdGhyZWFk X2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLnByb3BlcnRpZXMubmFtZSk7CisKKyAg ICAgIC8qIFVwZGF0ZSBvdXIgdGhyZWFkIHN0YXRlIHRvIHJlZmxlY3QgdGhlIHRhcmdldC4gICov CisgICAgICBmb3JfZWFjaF90aHJlYWQgKGRldmljZSwgdGhyZWFkLCBbJl0gKHRocmVhZF9pbmZv ICp0cCkKKwl7CisJICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworCSAg Z2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworCSAgemV0cC0+ZXhlY19zdGF0ZSA9IFpF X1RIUkVBRF9TVEFURV9VTkFWQUlMQUJMRTsKKwkgIHpldHAtPndhaXRzdGF0dXMuc2V0X3VuYXZh aWxhYmxlICgpOworCX0pOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJy b3IgKF8oIkZhaWxlZCB0byByZXN1bWUgJXMgb24gJXM6ICV4LiIpLAorCSAgICAgemVfdGhyZWFk X2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLnByb3BlcnRpZXMubmFtZSwKKwkgICAg IHN0YXR1cyk7CisgICAgfQorfQorCisvKiBJbnRlcnJ1cHQgVEhSRUFEIG9uIERFVklDRS4gICov CisKK3N0YXRpYyB2b2lkCit6ZV9pbnRlcnJ1cHQgKHplX2RldmljZV9pbmZvICZkZXZpY2UsIHpl X2RldmljZV90aHJlYWRfdCB0aHJlYWQpCit7CisgIGRwcmludGYgKCJkZXZpY2UgJWx1PSVzLCB0 aHJlYWQ9JXMsIG5yZXN1bWVkPSVsZCVzIiwKKwkgICBkZXZpY2Uub3JkaW5hbCwgZGV2aWNlLnBy b3BlcnRpZXMubmFtZSwKKwkgICB6ZV90aHJlYWRfaWRfc3RyICh0aHJlYWQpLmNfc3RyICgpLCBk ZXZpY2UubnJlc3VtZWQsCisJICAgKChkZXZpY2UubnJlc3VtZWQgPT0gZGV2aWNlLm50aHJlYWRz KSA/ICIgKGFsbCkiIDogIiIpKTsKKworICB6ZV9yZXN1bHRfdCBzdGF0dXMgPSB6ZXREZWJ1Z0lu dGVycnVwdCAoZGV2aWNlLnNlc3Npb24sIHRocmVhZCk7CisgIHN3aXRjaCAoc3RhdHVzKQorICAg IHsKKyAgICBjYXNlIFpFX1JFU1VMVF9TVUNDRVNTOgorICAgICAgaWYgKHplX2lzX3RocmVhZF9p ZF9hbGwgKHRocmVhZCkpCisJZGV2aWNlLm5pbnRlcnJ1cHRzKys7CisKKyAgICAgIGJyZWFrOwor CisgICAgY2FzZSBaRV9SRVNVTFRfTk9UX1JFQURZOgorICAgICAgLyogV2UgYWxyZWFkeSByZXF1 ZXN0ZWQgVEhSRUFEIHRvIGJlIHN0b3BwZWQuICBXZSBkbyBub3QgdHJhY2sKKwkgcmVxdWVzdHMg c28gbGV0J3MgaWdub3JlIHRoaXMuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpFX1JF U1VMVF9FUlJPUl9OT1RfQVZBSUxBQkxFOgorICAgICAgLyogVGhlIHRocmVhZCBpcyBhbHJlYWR5 IHN0b3BwZWQgb3IgdW5hdmFpbGFibGUuCisKKwkgQXNzdW1pbmcgdGhhdCBvdXIgc3RhdGUgdHJh Y2tpbmcgd29ya3MsIHVwZGF0ZSBub24tc3RvcHBlZAorCSB0aHJlYWRzIHRvIHJlZmxlY3QgdGhh dC4gICovCisgICAgICBmb3JfZWFjaF90aHJlYWQgKGRldmljZSwgdGhyZWFkLCBbJl0gKHRocmVh ZF9pbmZvICp0cCkKKwl7CisJICBpZiAoemVfdGhyZWFkX3N0b3BwZWQgKHRwKSkKKwkgICAgcmV0 dXJuOworCisJICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworCSAgZ2Ri X2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworCSAgemV0cC0+ZXhlY19zdGF0ZSA9IFpFX1RI UkVBRF9TVEFURV9VTkFWQUlMQUJMRTsKKwkgIHpldHAtPndhaXRzdGF0dXMuc2V0X3VuYXZhaWxh YmxlICgpOworCX0pOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yIChfKCJG YWlsZWQgdG8gaW50ZXJydXB0ICVzIG9uICVzOiAleC4iKSwKKwkgICAgIHplX3RocmVhZF9pZF9z dHIgKHRocmVhZCkuY19zdHIgKCksIGRldmljZS5wcm9wZXJ0aWVzLm5hbWUsCisJICAgICBzdGF0 dXMpOworICAgIH0KK30KKworYm9vbAoremVfdGFyZ2V0Ojppc19yYW5nZV9zdGVwcGluZyAodGhy ZWFkX2luZm8gKnRwKQoreworICBjb25zdCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVh ZCAodHApOworICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxwdHIpOworCisgIGlmICh6ZV90aHJl YWRfc3RvcHBlZCAodHApCisgICAgICAmJiAoemV0cC0+cmVzdW1lX3N0YXRlID09IFpFX1RIUkVB RF9SRVNVTUVfU1RFUCkKKyAgICAgICYmICh6ZXRwLT5zdG9wX3JlYXNvbiA9PSBUQVJHRVRfU1RP UFBFRF9CWV9TSU5HTEVfU1RFUCkpCisgICAgeworICAgICAgcmVnY2FjaGUgKnJlZ2NhY2hlID0g Z2V0X3RocmVhZF9yZWdjYWNoZSAodHAsIC8qIGZldGNoID0gKi8gdHJ1ZSk7CisgICAgICBDT1JF X0FERFIgcGMgPSByZWFkX3BjIChyZWdjYWNoZSk7CisKKyAgICAgIHJldHVybiAoKHBjID49IHpl dHAtPnN0ZXBfcmFuZ2Vfc3RhcnQpCisJICAgICAgJiYgKHBjIDwgemV0cC0+c3RlcF9yYW5nZV9l bmQpKTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbnQKK3plX3RhcmdldDo6YXR0 YWNoX3RvX2RldmljZSAodWludDMyX3QgcGlkLCB6ZV9kZXZpY2VfaGFuZGxlX3QgZGV2aWNlKQor eworICB6ZV9kZXZpY2VfcHJvcGVydGllc190IHByb3BlcnRpZXM7CisKKyAgbWVtc2V0ICgmcHJv cGVydGllcywgMCwgc2l6ZW9mIChwcm9wZXJ0aWVzKSk7CisgIHByb3BlcnRpZXMuc3R5cGUgPSBa RV9TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUFJPUEVSVElFUzsKKyAgcHJvcGVydGllcy5wTmV4dCA9 IG51bGxwdHI7CisKKyAgemVfcmVzdWx0X3Qgc3RhdHVzID0gemVEZXZpY2VHZXRQcm9wZXJ0aWVz IChkZXZpY2UsICZwcm9wZXJ0aWVzKTsKKyAgaWYgKHN0YXR1cyAhPSBaRV9SRVNVTFRfU1VDQ0VT UykKKyAgICB7CisgICAgICB3YXJuaW5nIChfKCJGYWlsZWQgdG8gb2J0YWluIGRldmljZSBwcm9w ZXJ0aWVzICgleCkuIiksCisJICAgICAgIHN0YXR1cyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9 CisKKyAgLyogV2UncmUgYSBiaXQgcGFyYW5vaWQuICAqLworICBwcm9wZXJ0aWVzLm5hbWVbWkVf TUFYX0RFVklDRV9OQU1FLTFdID0gMDsKKworICBpbnQgbmF0dGFjaGVkID0gMDsKKyAgdWludDMy X3QgbnN1Yl9kZXZpY2VzID0gMDsKKyAgc3RhdHVzID0gemVEZXZpY2VHZXRTdWJEZXZpY2VzIChk ZXZpY2UsICZuc3ViX2RldmljZXMsIG51bGxwdHIpOworICBpZiAoc3RhdHVzICE9IFpFX1JFU1VM VF9TVUNDRVNTKQorICAgIHdhcm5pbmcgKF8oIkZhaWxlZCB0byBnZXQgbnVtYmVyIG9mIHN1Yi1k ZXZpY2VzIGluICVzICgleCkuIiksCisJICAgICBwcm9wZXJ0aWVzLm5hbWUsIHN0YXR1cyk7Cisg IGVsc2UgaWYgKG5zdWJfZGV2aWNlcyA+IDApCisgICAgeworICAgICAgc3RkOjp2ZWN0b3I8emVf ZGV2aWNlX2hhbmRsZV90PiBzdWJfZGV2aWNlcyAobnN1Yl9kZXZpY2VzKTsKKyAgICAgIHN0YXR1 cyA9IHplRGV2aWNlR2V0U3ViRGV2aWNlcyAoZGV2aWNlLCAmbnN1Yl9kZXZpY2VzLAorCQkJCSAg ICAgIHN1Yl9kZXZpY2VzLmRhdGEgKCkpOworICAgICAgaWYgKHN0YXR1cyAhPSBaRV9SRVNVTFRf U1VDQ0VTUykKKwl3YXJuaW5nIChfKCJGYWlsZWQgdG8gZW51bWVyYXRlIHN1Yi1kZXZpY2VzIGlu ICVzICgleCkuIiksCisJCSBwcm9wZXJ0aWVzLm5hbWUsIHN0YXR1cyk7CisgICAgICBlbHNlCisJ Zm9yICh6ZV9kZXZpY2VfaGFuZGxlX3Qgc3ViX2RldmljZSA6IHN1Yl9kZXZpY2VzKQorCSAgbmF0 dGFjaGVkICs9IGF0dGFjaF90b19kZXZpY2UgKHBpZCwgc3ViX2RldmljZSk7CisgICAgfQorCisg IC8qIElmIHdlIGF0dGFjaGVkIHRvIGEgc3ViLWRldmljZSwgd2UncmUgZG9uZS4gIFdlIHdvbid0 IGJlIGFibGUgdG8gYXR0YWNoIHRvCisgICAgIGEgcGFyZW50IGRldmljZSwgYW55bW9yZS4gICov CisgIGlmIChuYXR0YWNoZWQgPiAwKQorICAgIHJldHVybiBuYXR0YWNoZWQ7CisKKyAgLyogQWxs b3cgYWZmZWN0aW5nIHRoZSBub3JtYWwgYXR0YWNoIGJlaGF2aW91ciB2aWEgZW52aXJvbm1lbnQg dmFyaWFibGVzIGJ5CisgICAgIGRpc2FsbG93aW5nIGF0dGFjaGluZyB0byBkZXZpY2VzIG9yIHN1 Yi1kZXZpY2VzLiAgKi8KKyAgaWYgKHByb3BlcnRpZXMuZmxhZ3MgJiBaRV9ERVZJQ0VfUFJPUEVS VFlfRkxBR19TVUJERVZJQ0UpCisgICAgeworICAgICAgY29uc3QgY2hhciAqIGNvbnN0IGRpc2Fs bG93X3N1Yl9kZXYKKwk9IHN0ZDo6Z2V0ZW52ICgiWkVfR0RCX0RPX05PVF9BVFRBQ0hfVE9fU1VC X0RFVklDRSIpOworICAgICAgaWYgKGRpc2FsbG93X3N1Yl9kZXYgIT0gbnVsbHB0ciAmJiAqZGlz YWxsb3dfc3ViX2RldiAhPSAwKQorCXJldHVybiBuYXR0YWNoZWQ7CisgICAgfQorICBlbHNlCisg ICAgeworICAgICAgY29uc3QgY2hhciAqIGNvbnN0IGRpc2FsbG93X2RldgorCT0gc3RkOjpnZXRl bnYgKCJaRV9HREJfRE9fTk9UX0FUVEFDSF9UT19ERVZJQ0UiKTsKKyAgICAgIGlmIChkaXNhbGxv d19kZXYgIT0gbnVsbHB0ciAmJiAqZGlzYWxsb3dfZGV2ICE9IDApCisJcmV0dXJuIG5hdHRhY2hl ZDsKKyAgICB9CisKKyAgdWludDMyX3QgbnJlZ3NldHMgPSAwOworICBzdGF0dXMgPSB6ZXREZWJ1 Z0dldFJlZ2lzdGVyU2V0UHJvcGVydGllcyAoZGV2aWNlLCAmbnJlZ3NldHMsIG51bGxwdHIpOwor ICBpZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorICAgIHsKKyAgICAgIHdhcm5pbmcg KF8oIkZhaWxlZCB0byBvYnRhaW4gbnVtYmVyIG9mIHJlZ2lzdGVyIHNldHMgaW4gJXMgKCV4KS4i KSwKKwkgICAgICAgcHJvcGVydGllcy5uYW1lLCBzdGF0dXMpOworICAgICAgcmV0dXJuIG5hdHRh Y2hlZDsKKyAgICB9CisKKyAgc3RkOjp2ZWN0b3I8emV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVz X3Q+IHJlZ3NldHMgKG5yZWdzZXRzKTsKKyAgc3RhdHVzID0gemV0RGVidWdHZXRSZWdpc3RlclNl dFByb3BlcnRpZXMgKGRldmljZSwgJm5yZWdzZXRzLAorCQkJCQkgICAgIHJlZ3NldHMuZGF0YSAo KSk7CisgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgd2Fy bmluZyAoXygiRmFpbGVkIHRvIG9idGFpbiByZWdpc3RlciBzZXRzIGluICVzICgleCkuIiksCisJ ICAgICAgIHByb3BlcnRpZXMubmFtZSwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBuYXR0YWNoZWQ7 CisgICAgfQorCisgIC8qIENoZWNrIHdpdGggdGhlIGFjdHVhbCB0YXJnZXQgaW1wbGVtZW50YXRp b24gd2hldGhlciBpdCBzdXBwb3J0cyB0aGlzIGtpbmQKKyAgICAgb2YgZGV2aWNlLiAgKi8KKyAg aWYgKCFpc19kZXZpY2Vfc3VwcG9ydGVkIChwcm9wZXJ0aWVzLCByZWdzZXRzKSkKKyAgICB7Cisg ICAgICBkcHJpbnRmICgic2tpcHBpbmcgdW5zdXBwb3J0ZWQgZGV2aWNlICVzLiIsIHByb3BlcnRp ZXMubmFtZSk7CisgICAgICByZXR1cm4gbmF0dGFjaGVkOworICAgIH0KKworICBzdGQ6OnVuaXF1 ZV9wdHI8emVfZGV2aWNlX2luZm8+IGRpbmZvIHsgbmV3IHplX2RldmljZV9pbmZvIH07CisgIGRp bmZvLT5jb25maWcucGlkID0gcGlkOworICBkaW5mby0+aGFuZGxlID0gZGV2aWNlOworICBkaW5m by0+cHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisKKyAgemVfcGNpX2V4dF9wcm9wZXJ0aWVzX3Qg cGNpX3Byb3BlcnRpZXMge307CisgIHN0YXR1cyA9IHplRGV2aWNlUGNpR2V0UHJvcGVydGllc0V4 dCAoZGV2aWNlLCAmcGNpX3Byb3BlcnRpZXMpOworICBpZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9T VUNDRVNTKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKF8oIkZhaWxlZCB0byBvYnRhaW4gUENJIHBy b3BlcnRpZXMgaW4gJXMgKCV4KS4iKSwKKwkgICAgICAgcHJvcGVydGllcy5uYW1lLCBzdGF0dXMp OworICAgICAgcGNpX3Byb3BlcnRpZXMuYWRkcmVzcy5kb21haW4gPSAwOworICAgICAgcGNpX3By b3BlcnRpZXMuYWRkcmVzcy5idXMgPSAwOworICAgICAgcGNpX3Byb3BlcnRpZXMuYWRkcmVzcy5k ZXZpY2UgPSAwOworICAgICAgcGNpX3Byb3BlcnRpZXMuYWRkcmVzcy5mdW5jdGlvbiA9IDA7Cisg ICAgfQorCisgIHRhcmdldF9kZXNjICp0ZGVzYyA9IGNyZWF0ZV90ZGVzYyAoZGluZm8uZ2V0ICgp LCByZWdzZXRzLAorCQkJCSAgICAgcGNpX3Byb3BlcnRpZXMpOworICBkaW5mby0+dGRlc2MucmVz ZXQgKHRkZXNjKTsKKworICB1bnNpZ25lZCBsb25nIG9yZGluYWwgPSB0aGlzLT5vcmRpbmFsICsg MTsKKyAgaWYgKG9yZGluYWwgPT0gMCkKKyAgICBpbnRlcm5hbF9lcnJvciAoXygiZGV2aWNlIG9y ZGluYWwgb3ZlcmZsb3cuIikpOworCisgIGRpbmZvLT5vcmRpbmFsID0gb3JkaW5hbDsKKworICB0 cnkKKyAgICB7CisgICAgICBwcm9jZXNzX2luZm8gKnByb2Nlc3MgPSB6ZV9hdHRhY2ggKGRpbmZv LmdldCAoKSk7CisgICAgICBpZiAocHJvY2VzcyA9PSBudWxscHRyKQorCXJldHVybiBuYXR0YWNo ZWQ7CisgICAgfQorICBjYXRjaCAoY29uc3QgZ2RiX2V4Y2VwdGlvbl9lcnJvciAmZXhjZXB0KQor ICAgIHsKKyAgICAgIHdhcm5pbmcgKCIlcyIsIGV4Y2VwdC53aGF0ICgpKTsKKyAgICB9CisKKyAg LyogQWRkIHRoZSBkZXZpY2UgZXZlbiBpZiB3ZSB3ZXJlIG5vdCBhYmxlIHRvIGF0dGFjaCB0byBh bGxvdyBhdHRlbXB0aW5nIHRvCisgICAgIGF0dGFjaCB0byBpdCBleHBsaWNpdGx5IGxhdGVyIG9u LiAgKi8KKyAgZGV2aWNlcy5wdXNoX2JhY2sgKGRpbmZvLnJlbGVhc2UgKCkpOworICB0aGlzLT5v cmRpbmFsID0gb3JkaW5hbDsKKworICBuYXR0YWNoZWQgKz0gMTsKKyAgcmV0dXJuIG5hdHRhY2hl ZDsKK30KKworaW50Cit6ZV90YXJnZXQ6OmF0dGFjaF90b19kZXZpY2VzICh1aW50MzJfdCBwaWQp Cit7CisgIHVpbnQzMl90IG5kcml2ZXJzID0gMDsKKyAgemVfcmVzdWx0X3Qgc3RhdHVzID0gemVE cml2ZXJHZXQgKCZuZHJpdmVycywgbnVsbHB0cik7CisgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxU X1NVQ0NFU1MpCisgICAgZXJyb3IgKF8oIkZhaWxlZCB0byBnZXQgbnVtYmVyIG9mIGRldmljZSBk cml2ZXJzICgleCkuIiksIHN0YXR1cyk7CisKKyAgc3RkOjp2ZWN0b3I8emVfZHJpdmVyX2hhbmRs ZV90PiBkcml2ZXJzIChuZHJpdmVycyk7CisgIHN0YXR1cyA9IHplRHJpdmVyR2V0ICgmbmRyaXZl cnMsIGRyaXZlcnMuZGF0YSAoKSk7CisgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NVQ0NFU1Mp CisgICAgZXJyb3IgKF8oIkZhaWxlZCB0byBlbnVtZXJhdGUgZGV2aWNlIGRyaXZlcnMgKCV4KS4i KSwgc3RhdHVzKTsKKworICBpbnQgbmF0dGFjaGVkID0gMDsKKyAgZm9yICh6ZV9kcml2ZXJfaGFu ZGxlX3QgZHJpdmVyIDogZHJpdmVycykKKyAgICB7CisgICAgICB6ZV9kcml2ZXJfcHJvcGVydGll c190IHByb3BlcnRpZXM7CisKKyAgICAgIG1lbXNldCAoJnByb3BlcnRpZXMsIDAsIHNpemVvZiAo cHJvcGVydGllcykpOworICAgICAgcHJvcGVydGllcy5zdHlwZSA9IFpFX1NUUlVDVFVSRV9UWVBF X0RSSVZFUl9QUk9QRVJUSUVTOworICAgICAgcHJvcGVydGllcy5wTmV4dCA9IG51bGxwdHI7CisK KyAgICAgIHN0YXR1cyA9IHplRHJpdmVyR2V0UHJvcGVydGllcyAoZHJpdmVyLCAmcHJvcGVydGll cyk7CisgICAgICBpZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorCXsKKwkgIHdhcm5p bmcgKF8oIkZhaWxlZCB0byBvYnRhaW4gZHJpdmVyIHByb3BlcnRpZXMgKCV4KS4iKSwKKwkJICAg c3RhdHVzKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgemVfYXBpX3ZlcnNpb25fdCB2ZXJz aW9uOworICAgICAgc3RhdHVzID0gemVEcml2ZXJHZXRBcGlWZXJzaW9uIChkcml2ZXIsICZ2ZXJz aW9uKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NVQ0NFU1MpCisJeworCSAgd2Fy bmluZyAoXygiRmFpbGVkIHRvIG9idGFpbiBBUEkgdmVyc2lvbiBpbiAlcyAoJXgpLiIpLAorCQkg ICBkcml2ZXJfdXVpZF9zdHIgKHByb3BlcnRpZXMudXVpZCkuY19zdHIgKCksCisJCSAgIHN0YXR1 cyk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHN3aXRjaCAoWkVfTUFKT1JfVkVSU0lPTiAo dmVyc2lvbikpCisJeworCWNhc2UgMToKKwkgIC8qIFdlIHNob3VsZCBiZSBPSyB3aXRoIGFsbCBt aW5vciB2ZXJzaW9ucy4gICovCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB3YXJuaW5nIChf KCJVbnN1cHBvcnRlZCBBUEkgdmVyc2lvbiBpbiAlcyAoJXgpLiIpLAorCQkgICBkcml2ZXJfdXVp ZF9zdHIgKHByb3BlcnRpZXMudXVpZCkuY19zdHIgKCksCisJCSAgIFpFX01BSk9SX1ZFUlNJT04g KHZlcnNpb24pKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgdWludDMyX3QgbmRldmljZXMg PSAwOworICAgICAgc3RhdHVzID0gemVEZXZpY2VHZXQgKGRyaXZlciwgJm5kZXZpY2VzLCBudWxs cHRyKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NVQ0NFU1MpCisJeworCSAgd2Fy bmluZyAoXygiRmFpbGVkIHRvIGdldCBudW1iZXIgb2YgZGV2aWNlcyBpbiAlcyAoJXgpLiIpLAor CQkgICBkcml2ZXJfdXVpZF9zdHIgKHByb3BlcnRpZXMudXVpZCkuY19zdHIgKCksCisJCSAgIHN0 YXR1cyk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHN0ZDo6dmVjdG9yPHplX2RldmljZV9o YW5kbGVfdD4gZGV2aWNlcyAobmRldmljZXMpOworICAgICAgc3RhdHVzID0gemVEZXZpY2VHZXQg KGRyaXZlciwgJm5kZXZpY2VzLCBkZXZpY2VzLmRhdGEgKCkpOworICAgICAgaWYgKHN0YXR1cyAh PSBaRV9SRVNVTFRfU1VDQ0VTUykKKwl7CisJICB3YXJuaW5nIChfKCJGYWlsZWQgdG8gZW51bWVy YXRlIGRldmljZXMgaW4gJXMgKCV4KS4iKSwKKwkJICAgZHJpdmVyX3V1aWRfc3RyIChwcm9wZXJ0 aWVzLnV1aWQpLmNfc3RyICgpLAorCQkgICBzdGF0dXMpOworCSAgY29udGludWU7CisJfQorCisg ICAgICBkcHJpbnRmICgic2Nhbm5pbmcgZHJpdmVyICVzICglIiBQUkl1MzIgIiBkZXZpY2VzKSIs CisJICAgICAgIGRyaXZlcl91dWlkX3N0ciAocHJvcGVydGllcy51dWlkKS5jX3N0ciAoKSwgbmRl dmljZXMpOworCisgICAgICBmb3IgKHplX2RldmljZV9oYW5kbGVfdCBkZXZpY2UgOiBkZXZpY2Vz KQorCW5hdHRhY2hlZCArPSBhdHRhY2hfdG9fZGV2aWNlIChwaWQsIGRldmljZSk7CisgICAgfQor CisgIHJldHVybiBuYXR0YWNoZWQ7Cit9CisKK3VpbnQ2NF90Cit6ZV90YXJnZXQ6OmZldGNoX2V2 ZW50cyAoemVfZGV2aWNlX2luZm8gJmRldmljZSkKK3sKKyAgLyogVGhlcmUgYXJlIG5vIGV2ZW50 cyBpZiB3ZSdyZSBub3QgYXR0YWNoZWQuICAqLworICBpZiAoZGV2aWNlLnNlc3Npb24gPT0gbnVs bHB0cikKKyAgICByZXR1cm4gMDsKKworICB1aW50NjRfdCBuZXZlbnRzID0gMDsKKyAgZm9yICg7 OykKKyAgICB7CisgICAgICB6ZXRfZGVidWdfZXZlbnRfdCBldmVudCA9IHt9OworICAgICAgemVf cmVzdWx0X3Qgc3RhdHVzID0gemV0RGVidWdSZWFkRXZlbnQgKGRldmljZS5zZXNzaW9uLCAwdWxs LCAmZXZlbnQpOworICAgICAgc3dpdGNoIChzdGF0dXMpCisJeworCWNhc2UgWkVfUkVTVUxUX1NV Q0NFU1M6CisJICBuZXZlbnRzICs9IDE7CisJICBicmVhazsKKworCWNhc2UgWkVfUkVTVUxUX05P VF9SRUFEWToKKwkgIHJldHVybiBuZXZlbnRzOworCisJZGVmYXVsdDoKKwkgIGVycm9yIChfKCJl cnJvciBmZXRjaGluZyBldmVudHMgZnJvbSAlczogJXguIiksCisJCSBkZXZpY2UucHJvcGVydGll cy5uYW1lLCBzdGF0dXMpOworCX0KKworICAgICAgZHByaW50ZiAoInJlY2VpdmVkIGV2ZW50IGZy b20gZGV2aWNlICVsdTogJXMiLCBkZXZpY2Uub3JkaW5hbCwKKwkgICAgICAgemVfZXZlbnRfc3Ry IChldmVudCkuY19zdHIgKCkpOworCisgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpCisJeworCWNh c2UgWkVUX0RFQlVHX0VWRU5UX1RZUEVfSU5WQUxJRDoKKwkgIGJyZWFrOworCisJY2FzZSBaRVRf REVCVUdfRVZFTlRfVFlQRV9ERVRBQ0hFRDoKKwkgIHsKKwkgICAgcHJvY2Vzc19pbmZvICpwcm9j ZXNzID0gZGV2aWNlLnByb2Nlc3M7CisJICAgIGlmIChwcm9jZXNzICE9IG51bGxwdHIpCisJICAg ICAgemVfZGV2aWNlX2RldGFjaGVkIChwcm9jZXNzLCBldmVudC5pbmZvLmRldGFjaGVkLnJlYXNv bik7CisKKwkgICAgLyogV2UncmUgZGV0YWNoZWQsIG5vdy4gICovCisJICAgIGRldmljZS5zZXNz aW9uID0gbnVsbHB0cjsKKwkgIH0KKwkgIHJldHVybiBuZXZlbnRzOworCisJY2FzZSBaRVRfREVC VUdfRVZFTlRfVFlQRV9QUk9DRVNTX0VOVFJZOgorCSAgemVfYWNrX2V2ZW50IChkZXZpY2UsIGV2 ZW50KTsKKwkgIHplX3Nob3dfcHJvY2VzcyAoZGV2aWNlLnByb2Nlc3MpOworCSAgY29udGludWU7 CisKKwljYXNlIFpFVF9ERUJVR19FVkVOVF9UWVBFX1BST0NFU1NfRVhJVDoKKwkgIHplX2Fja19l dmVudCAoZGV2aWNlLCBldmVudCk7CisJICB6ZV9oaWRlX3Byb2Nlc3MgKGRldmljZS5wcm9jZXNz KTsKKwkgIGNvbnRpbnVlOworCisJY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9NT0RVTEVfTE9B RDoKKwkgIHsKKwkgICAgLyogV2Ugd291bGQgbm90IHJlbWFpbiBhdHRhY2hlZCB3aXRob3V0IGEg cHJvY2Vzcy4gICovCisJICAgIHByb2Nlc3NfaW5mbyAqcHJvY2VzcyA9IGRldmljZS5wcm9jZXNz OworCSAgICBnZGJfYXNzZXJ0IChwcm9jZXNzICE9IG51bGxwdHIpOworCisJICAgIGJvb2wgbmVl ZF9hY2sKKwkgICAgICA9ICgoZXZlbnQuZmxhZ3MgJiBaRVRfREVCVUdfRVZFTlRfRkxBR19ORUVE X0FDSykgIT0gMCk7CisJICAgIGxvYWRlZF9kbGwgKHByb2Nlc3MsIGV2ZW50LmluZm8ubW9kdWxl Lm1vZHVsZUJlZ2luLAorCQkJZXZlbnQuaW5mby5tb2R1bGUubW9kdWxlRW5kLAorCQkJZXZlbnQu aW5mby5tb2R1bGUubG9hZCwgbmVlZF9hY2spOworCisJICAgIC8qIElmIExldmVsLVplcm8gaXMg bm90IHJlcXVlc3RpbmcgdGhlIGV2ZW50IHRvIGJlCisJICAgICAgIGFja25vd2xlZGdlZCwgd2Un cmUgZG9uZS4KKworCSAgICAgICBUaGlzIGhhcHBlbnMgd2hlbiBhdHRhY2hpbmcgdG8gYW4gYWxy ZWFkeSBydW5uaW5nIHByb2Nlc3MsCisJICAgICAgIGZvciBleGFtcGxlLiAgV2Ugd2lsbCByZWNl aXZlIG1vZHVsZSBsb2FkIGV2ZW50cyBmb3IKKwkgICAgICAgbW9kdWxlcyB0aGF0IGhhdmUgYWxy ZWFkeSBiZWVuIGxvYWRlZC4KKworCSAgICAgICBObyBuZWVkIHRvIGluZm9ybSBHREIsIGVpdGhl ciwgYXMgd2UgZXhwZWN0IEdEQiB0byBxdWVyeQorCSAgICAgICBzaGFyZWQgbGlicmFyaWVzIGFm dGVyIGF0dGFjaC4gICovCisJICAgIGlmICghbmVlZF9hY2spCisJICAgICAgY29udGludWU7CisK KwkgICAgZGV2aWNlLmFja19wZW5kaW5nLmVtcGxhY2VfYmFjayAoZXZlbnQpOworCisJICAgIC8q IExvYWRpbmcgYSBuZXcgbW9kdWxlIGlzIGEgcHJvY2VzcyBldmVudC4gIFdlIGRvIG5vdCB3YW50 IHRvCisJICAgICAgIG92ZXJ3cml0ZSBvdGhlciBwcm9jZXNzIGV2ZW50cywgaG93ZXZlciwgYXMg bW9kdWxlIGxvYWRzCisJICAgICAgIGNhbiBhbHNvIGJlIGNvbW11bmljYXRlZCBhcyBwYXJ0IG9m IG90aGVyIGV2ZW50cy4gICovCisJICAgIHByb2Nlc3NfaW5mb19wcml2YXRlICp6ZXByb2MgPSBw cm9jZXNzLT5wcml2OworCSAgICBnZGJfYXNzZXJ0ICh6ZXByb2MgIT0gbnVsbHB0cik7CisKKwkg ICAgaWYgKHplcHJvYy0+d2FpdHN0YXR1cy5raW5kICgpICE9IFRBUkdFVF9XQUlUS0lORF9JR05P UkUpCisJICAgICAgY29udGludWU7CisKKwkgICAgLyogV2UgdXNlIFVOQVZBSUxBQkxFIHJhdGhl ciB0aGFuIExPQURFRCBhcyB0aGUgbGF0dGVyIGltcGxpZXMKKwkgICAgICAgdGhhdCB0aGUgdGFy Z2V0IGhhcyBzdG9wcGVkLiAgKi8KKwkgICAgemVwcm9jLT53YWl0c3RhdHVzLnNldF91bmF2YWls YWJsZSAoKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCisJY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQ RV9NT0RVTEVfVU5MT0FEOgorCSAgeworCSAgICAvKiBXZSB3b3VsZCBub3QgcmVtYWluIGF0dGFj aGVkIHdpdGhvdXQgYSBwcm9jZXNzLiAgKi8KKwkgICAgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0g ZGV2aWNlLnByb2Nlc3M7CisJICAgIGdkYl9hc3NlcnQgKHByb2Nlc3MgIT0gbnVsbHB0cik7CisK KwkgICAgdW5sb2FkZWRfZGxsIChwcm9jZXNzLCBldmVudC5pbmZvLm1vZHVsZS5tb2R1bGVCZWdp biwKKwkJCSAgZXZlbnQuaW5mby5tb2R1bGUubW9kdWxlRW5kLAorCQkJICBldmVudC5pbmZvLm1v ZHVsZS5sb2FkKTsKKworCSAgICAvKiBXZSBkb24ndCBuZWVkIGFuIGFjaywgaGVyZSwgYnV0IG1h eWJlIExldmVsLVplcm8gZG9lcy4gICovCisJICAgIHplX2Fja19ldmVudCAoZGV2aWNlLCBldmVu dCk7CisKKwkgICAgLyogV2UgZG8gbm90IG5vdGlmeSBHREIgaW1tZWRpYXRlbHkgYWJvdXQgdGhl IG1vZHVsZSB1bmxvYWQuCisJICAgICAgIFRoaXMgaXMgaGFybWxlc3MgdW50aWwgd2UgcmVjbGFp bSB0aGUgbWVtb3J5IGZvciBzb21ldGhpbmcKKwkgICAgICAgZWxzZS4gIEluIG91ciBjYXNlLCB0 aGlzIGNhbiBvbmx5IGJlIGFub3RoZXIgbW9kdWxlIGFuZCB3ZQorCSAgICAgICB3aWxsIG5vdGlm eSBHREIgaW4gdGhhdCBjYXNlLiAgKi8KKwkgIH0KKwkgIGNvbnRpbnVlOworCisJY2FzZSBaRVRf REVCVUdfRVZFTlRfVFlQRV9USFJFQURfU1RPUFBFRDoKKwkgIHsKKwkgICAgemVfZGV2aWNlX3Ro cmVhZF90IHRpZCA9IGV2ZW50LmluZm8udGhyZWFkLnRocmVhZDsKKwkgICAgemVfYWNrX2V2ZW50 IChkZXZpY2UsIGV2ZW50KTsKKworCSAgICAvKiBXZSB3b3VsZCBub3QgcmVtYWluIGF0dGFjaGVk IHdpdGhvdXQgYSBwcm9jZXNzLiAgKi8KKwkgICAgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0gZGV2 aWNlLnByb2Nlc3M7CisJICAgIGdkYl9hc3NlcnQgKHByb2Nlc3MgIT0gbnVsbHB0cik7CisKKwkg ICAgdWludDMyX3QgbnN0b3BwZWQgPSAwOworCSAgICBmb3JfZWFjaF90aHJlYWQgKGRldmljZSwg dGlkLCBbJl0gKHRocmVhZF9pbmZvICp0cCkKKwkgICAgICB7CisJCS8qIElnbm9yZSB0aHJlYWRz IHdlIGtub3cgdG8gYmUgc3RvcHBlZC4KKworCQkgICBXZSBhbHJlYWR5IGFuYWx5emVkIHRoZSBz dG9wIHJlYXNvbiBhbmQgcHJvYmFibHkKKwkJICAgZGVzdHJveWVkIGl0IGluIHRoZSBwcm9jZXNz LiAgKi8KKwkJaWYgKHplX3RocmVhZF9zdG9wcGVkICh0cCkpCisJCSAgcmV0dXJuOworCisJCS8q IFByZXZlbnQgdW5kZXJmbG93aW5nLiAgKi8KKwkJaWYgKGRldmljZS5ucmVzdW1lZCA+IDApCisJ CSAgZGV2aWNlLm5yZXN1bWVkLS07CisKKwkJemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJl YWQgKHRwKTsKKwkJZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworCQkvKiBEaXNjYXJk IGFueSByZWdpc3RlcnMgd2UgbWF5IGhhdmUgZmV0Y2hlZCB3aGlsZSBUUCB3YXMKKwkJICAgdW5h dmFpbGFibGUuICAqLworCQl6ZV9kaXNjYXJkX3JlZ2NhY2hlICh0cCk7CisJCXRyeQorCQkgIHsK KwkJICAgIGdkYl9zaWduYWwgc2lnbmFsID0gR0RCX1NJR05BTF8wOworCisJCSAgICAvKiBJZiB0 aGlzIGlzIGFuIHVuYXZhaWxhYmxlIHRocmVhZCB3aXRoIGEgJ3N0b3AnCisJCSAgICAgICByZXN1 bWUgc3RhdGUsIGZyb20gR0RCJ3MgcG9pbnQgb2YgdmlldyB0aGUKKwkJICAgICAgIHRocmVhZCB3 YXMgaW50ZXJydXB0ZWQuICBJbiBhbGwtc3RvcCBtb2RlLCB3ZQorCQkgICAgICAga2VlcCB0aGUg ZXZlbnQgaGVsZCB0byBub3QgY29uZnVzZSBHREIuCisKKwkJICAgICAgIERvIHRoZSBzdGF0ZSB1 cGRhdGUgYmVmb3JlIGdldF9zdG9wX3JlYXNvbgorCQkgICAgICAgYmVsb3csIHNvIHRoYXQgaW4g Y2FzZSB3ZSBhY2Nlc3MgbWVtb3J5LCB3ZQorCQkgICAgICAgd2lsbCBkbyB0aGF0IHVzaW5nIHRo ZSByaWdodCB0aHJlYWQKKwkJICAgICAgIGNvbnRleHQuICAqLworCQkgICAgaWYgKCFub25fc3Rv cAorCQkJJiYgKHpldHAtPmV4ZWNfc3RhdGUgPT0gWkVfVEhSRUFEX1NUQVRFX1VOQVZBSUxBQkxF KQorCQkJJiYgKHpldHAtPnJlc3VtZV9zdGF0ZSA9PSBaRV9USFJFQURfUkVTVU1FX1NUT1ApKQor CQkgICAgICB6ZXRwLT5leGVjX3N0YXRlID0gWkVfVEhSRUFEX1NUQVRFX0hFTEQ7CisJCSAgICBl bHNlCisJCSAgICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfU1RPUFBFRDsK KworCQkgICAgdGFyZ2V0X3N0b3BfcmVhc29uIHJlYXNvbiA9IGdldF9zdG9wX3JlYXNvbiAodHAs IHNpZ25hbCk7CisKKwkJICAgIHpldHAtPnN0b3BfcmVhc29uID0gcmVhc29uOworCQkgICAgemV0 cC0+d2FpdHN0YXR1cy5zZXRfc3RvcHBlZCAoc2lnbmFsKTsKKwkJICAgIG5zdG9wcGVkICs9IDE7 CisJCSAgfQorCQkvKiBGSVhNRTogZXhjZXB0aW9ucworCisJCSAgIFdlJ2QgcmVhbGx5IGxpa2Ug dG8gY2F0Y2ggc29tZSAndGhyZWFkX3VuYXZhaWxhYmxlJworCQkgICBleGNlcHRpb24gcmF0aGVy IHRoYW4gYXNzdW1pbmcgdGhhdCBhbnkgZXhjZXB0aW9uIGlzCisJCSAgIGR1ZSB0byB0aHJlYWQg YXZhaWxhYmlsaXR5LiAgKi8KKwkJY2F0Y2ggKC4uLikKKwkJICB7CisJCSAgICB6ZXRwLT5leGVj X3N0YXRlID0gWkVfVEhSRUFEX1NUQVRFX1VOQVZBSUxBQkxFOworCQkgICAgemV0cC0+d2FpdHN0 YXR1cy5zZXRfdW5hdmFpbGFibGUgKCk7CisJCSAgfQorCSAgICAgIH0pOworCisJICAgIGRwcmlu dGYgKCJkZXZpY2UgJWx1J3MgbnJlc3VtZWQ9JWxkJXMiLAorCQkgICAgIGRldmljZS5vcmRpbmFs LCBkZXZpY2UubnJlc3VtZWQsCisJCSAgICAgKChkZXZpY2UubnJlc3VtZWQgPT0gZGV2aWNlLm50 aHJlYWRzKSA/ICIgKGFsbCkiIDogIiIpKTsKKworCSAgICAvKiBUaGlzIGlzIHRoZSByZXNwb25z ZSB0byBhbiBpbnRlcnJ1cHQgaWYgVElEIGlzICJhbGwiLiAgKi8KKwkgICAgaWYgKHplX2lzX3Ro cmVhZF9pZF9hbGwgKHRpZCkpCisJICAgICAgeworCQlpZiAoZGV2aWNlLm5pbnRlcnJ1cHRzID4g MCkKKwkJICBkZXZpY2UubmludGVycnVwdHMtLTsKKwkJZWxzZQorCQkgIHdhcm5pbmcgKF8oImln bm9yaW5nIHNwdXJpb3VzIHN0b3AtYWxsIGV2ZW50IG9uICIKKwkJCSAgICAgImRldmljZSAlbHUi KSwgZGV2aWNlLm9yZGluYWwpOworCSAgICAgIH0KKworCSAgICAvKiBBIHRocmVhZCBldmVudCB0 dXJucyBhIHByb2Nlc3MgdmlzaWJsZS4gICovCisJICAgIGlmIChuc3RvcHBlZCA+IDApCisJICAg ICAgemVfc2hvd19wcm9jZXNzIChwcm9jZXNzKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCisJY2Fz ZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9USFJFQURfVU5BVkFJTEFCTEU6CisJICB7CisJICAgIHpl X2RldmljZV90aHJlYWRfdCB0aWQgPSBldmVudC5pbmZvLnRocmVhZC50aHJlYWQ7CisJICAgIHpl X2Fja19ldmVudCAoZGV2aWNlLCBldmVudCk7CisKKwkgICAgLyogV2Ugd291bGQgbm90IHJlbWFp biBhdHRhY2hlZCB3aXRob3V0IGEgcHJvY2Vzcy4gICovCisJICAgIHByb2Nlc3NfaW5mbyAqcHJv Y2VzcyA9IGRldmljZS5wcm9jZXNzOworCSAgICBnZGJfYXNzZXJ0IChwcm9jZXNzICE9IG51bGxw dHIpOworCisJICAgIGZvcl9lYWNoX3RocmVhZCAoZGV2aWNlLCB0aWQsIFsmXSAodGhyZWFkX2lu Zm8gKnRwKQorCSAgICAgIHsKKwkJLyogSWdub3JlIHRocmVhZHMgd2Uga25vdyB0byBiZSBzdG9w cGVkLgorCisJCSAgIFRoZXkgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgaW4gdGhlIHJlc3BvbnNl IGV2ZW50IGZvcgorCQkgICBhbiBpbnRlcnJ1cHQgcmVxdWVzdC4gICovCisJCWlmICh6ZV90aHJl YWRfc3RvcHBlZCAodHApKQorCQkgIHJldHVybjsKKworCQkvKiBQcmV2ZW50IHVuZGVyZmxvd2lu Zy4gICovCisJCWlmIChkZXZpY2UubnJlc3VtZWQgPiAwKQorCQkgIGRldmljZS5ucmVzdW1lZC0t OworCisJCXplX3RocmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFkICh0cCk7CisJCWdkYl9hc3Nl cnQgKHpldHAgIT0gbnVsbHB0cik7CisKKwkJemV0cC0+ZXhlY19zdGF0ZSA9IFpFX1RIUkVBRF9T VEFURV9VTkFWQUlMQUJMRTsKKwkJemV0cC0+d2FpdHN0YXR1cy5zZXRfdW5hdmFpbGFibGUgKCk7 CisJICAgICAgfSk7CisKKwkgICAgZHByaW50ZiAoImRldmljZSAlbHUncyBucmVzdW1lZD0lbGQl cyIsCisJCSAgICAgZGV2aWNlLm9yZGluYWwsIGRldmljZS5ucmVzdW1lZCwKKwkJICAgICAoKGRl dmljZS5ucmVzdW1lZCA9PSBkZXZpY2UubnRocmVhZHMpID8gIiAoYWxsKSIgOiAiIikpOworCisJ ICAgIC8qIFRoaXMgaXMgdGhlIHJlc3BvbnNlIHRvIGFuIGludGVycnVwdCBpZiBUSUQgaXMgImFs bCIuICAqLworCSAgICBpZiAoemVfaXNfdGhyZWFkX2lkX2FsbCAodGlkKSkKKwkgICAgICB7CisJ CWlmIChkZXZpY2UubmludGVycnVwdHMgPiAwKQorCQkgIGRldmljZS5uaW50ZXJydXB0cy0tOwor CQllbHNlCisJCSAgd2FybmluZyAoXygiaWdub3Jpbmcgc3B1cmlvdXMgdW5hdmFpbGFibGUtYWxs IGV2ZW50IG9uICIKKwkJCSAgICAgImRldmljZSAlbHUiKSwgZGV2aWNlLm9yZGluYWwpOworCSAg ICAgIH0KKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogV2Ugb25seSBnZXQgaGVy ZSBpZiB3ZSBoYXZlIG5vdCBwcm9jZXNzZWQgRVZFTlQuICAqLworICAgICAgd2FybmluZyAoXygi aWdub3JpbmcgZXZlbnQgJyVzJyBvbiAlcy4iKSwKKwkgICAgICAgemVfZXZlbnRfc3RyIChldmVu dCkuY19zdHIgKCksCisJICAgICAgIGRldmljZS5wcm9wZXJ0aWVzLm5hbWUpOworCisgICAgICAv KiBBY2tub3dsZWRnZSB0aGUgaWdub3JlZCBldmVudCBzbyB3ZSBkb24ndCBnZXQgc3R1Y2suICAq LworICAgICAgemVfYWNrX2V2ZW50IChkZXZpY2UsIGV2ZW50KTsKKyAgICB9Cit9CisKK3ZvaWQK K3plX3RhcmdldDo6ZmV0Y2hfZXZlbnRzX2FsbF9kZXZpY2VzX25vX3Jlc3VtZWQgKCkKK3sKKyAg dWludDY0X3QgbnJlc3VtZWQgPSAwOworICBkbyB7CisgICAgbnJlc3VtZWQgPSAwOworICAgIGZv ciAoemVfZGV2aWNlX2luZm8gKmRldmljZSA6IGRldmljZXMpCisgICAgICB7CisJZ2RiX2Fzc2Vy dCAoZGV2aWNlICE9IG51bGxwdHIpOworCisJLyogSWdub3JlIGRldmljZXMgd2UncmUgbm90IG1v ZGVsbGluZyBhcyBwcm9jZXNzZXMuICAqLworCWlmIChkZXZpY2UtPnByb2Nlc3MgPT0gbnVsbHB0 cikKKwkgIGNvbnRpbnVlOworCisJLyogRXZlbnQgcHJvY2Vzc2luZyBtYWludGFpbnMgdGhlIG51 bWJlciBvZiByZXN1bWVkIHRocmVhZHMuICAqLworCWZldGNoX2V2ZW50cyAoKmRldmljZSk7CisJ bnJlc3VtZWQgKz0gZGV2aWNlLT5ucmVzdW1lZDsKKyAgICAgIH0KKyAgfQorICB3aGlsZSAobnJl c3VtZWQgIT0gMCk7Cit9CisKK3ZvaWQKK3plX3RhcmdldDo6aW5pdCAoKQoreworICB6ZV9yZXN1 bHRfdCBzdGF0dXMgPSB6ZUluaXQgKDApOworICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAg Y2FzZSBaRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAg ICAgIGVycm9yIChfKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBMZXZlbC1aZXJvOiAleCIpLCBzdGF0 dXMpOworICAgIH0KK30KKworYm9vbAoremVfdGFyZ2V0Ojphc3luYyAoYm9vbCBlbmFibGUpCit7 CisgIGJvb2wgcHJldmlvdXMgPSB6ZV9pc19hc3luYyAoKTsKKyAgaWYgKHByZXZpb3VzICE9IGVu YWJsZSkKKyAgICB7CisjaWZuZGVmIFVTRV9XSU4zMkFQSQorICAgICAgaWYgKGVuYWJsZSkKKwl7 CisJICB0cnkKKwkgICAgeworCSAgICAgIGVycm5vID0gMDsKKwkgICAgICBpbnQgc3RhdHVzID0g cGlwZSAoemVfZXZlbnRfcGlwZSk7CisJICAgICAgaWYgKHN0YXR1cyA9PSAtMSkKKwkJZXJyb3Ig KF8oIkZhaWxlZCB0byBjcmVhdGUgZXZlbnQgcGlwZTogJXMuIiksCisJCSAgICAgICBzYWZlX3N0 cmVycm9yIChlcnJubykpOworCisJICAgICAgc3RhdHVzID0gZmNudGwgKHplX2V2ZW50X3BpcGVb MF0sIEZfU0VURkwsIE9fTk9OQkxPQ0spOworCSAgICAgIGlmIChzdGF0dXMgPT0gLTEpCisJCWVy cm9yIChfKCJGYWlsZWQgdG8gc2V0IHBpcGVbMF0gdG8gbm9uLWJsb2NraW5nOiAlcy4iKSwKKwkJ ICAgICAgIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisKKwkgICAgICBzdGF0dXMgPSBmY250bCAo emVfZXZlbnRfcGlwZVsxXSwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisJICAgICAgaWYgKHN0YXR1 cyA9PSAtMSkKKwkJZXJyb3IgKF8oIkZhaWxlZCB0byBzZXQgcGlwZVsxXSB0byBub24tYmxvY2tp bmc6ICVzLiIpLAorCQkgICAgICAgc2FmZV9zdHJlcnJvciAoZXJybm8pKTsKKworCSAgICAgIC8q IFJlZ2lzdGVyIHRoZSBldmVudCBsb29wIGhhbmRsZXIuICAqLworCSAgICAgIGFkZF9maWxlX2hh bmRsZXIgKHplX2V2ZW50X3BpcGVbMF0sCisJCQkJaGFuZGxlX3RhcmdldF9ldmVudCwgTlVMTCwK KwkJCQkiemUtbG93Iik7CisKKwkgICAgICAvKiBBbHdheXMgdHJpZ2dlciBhIHdhaXQuICAqLwor CSAgICAgIHplX2FzeW5jX21hcmsgKCk7CisJICAgIH0KKwkgIGNhdGNoIChzdGQ6OmV4Y2VwdGlv biAmZXgpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiJXMiLCBleC53aGF0ICgpKTsKKworCSAg ICAgIGlmICh6ZV9ldmVudF9waXBlWzBdICE9IC0xKQorCQl7CisJCSAgY2xvc2UgKHplX2V2ZW50 X3BpcGVbMF0pOworCQkgIHplX2V2ZW50X3BpcGVbMF0gPSAtMTsKKwkJfQorCisJICAgICAgaWYg KHplX2V2ZW50X3BpcGVbMV0gIT0gLTEpCisJCXsKKwkJICBjbG9zZSAoemVfZXZlbnRfcGlwZVsx XSk7CisJCSAgemVfZXZlbnRfcGlwZVsxXSA9IC0xOworCQl9CisJICAgIH0KKwl9CisgICAgICBl bHNlCisJeworCSAgZGVsZXRlX2ZpbGVfaGFuZGxlciAoemVfZXZlbnRfcGlwZVswXSk7CisKKwkg IGNsb3NlICh6ZV9ldmVudF9waXBlWzBdKTsKKwkgIGNsb3NlICh6ZV9ldmVudF9waXBlWzFdKTsK KwkgIHplX2V2ZW50X3BpcGVbMF0gPSAtMTsKKwkgIHplX2V2ZW50X3BpcGVbMV0gPSAtMTsKKwl9 CisjZWxzZQorICAgICAgZXJyb3IgKF8oIiVzOiB0YmQiKSwgX19GVU5DVElPTl9fKTsKKyNlbmRp ZgorICAgIH0KKworICByZXR1cm4gcHJldmlvdXM7Cit9CisKK2ludAoremVfdGFyZ2V0OjpjcmVh dGVfaW5mZXJpb3IgKGNvbnN0IGNoYXIgKnByb2dyYW0sCisJCQkgICAgY29uc3Qgc3RkOjp2ZWN0 b3I8Y2hhciAqPiAmYXJndikKK3sKKyAgLyogTGV2ZWwtemVybyBkb2VzIG5vdCBzdXBwb3J0IGNy ZWF0aW5nIGluZmVyaW9ycy4gICovCisgIHJldHVybiAtMTsKK30KKworaW50Cit6ZV90YXJnZXQ6 OmF0dGFjaCAoaW50IHBpZCkKK3sKKyAgaWYgKCFkZXZpY2VzLmVtcHR5ICgpKQorICAgIGVycm9y IChfKCJBbHJlYWR5IGF0dGFjaGVkLiIpKTsKKworICB1aW50MzJfdCBob3N0cGlkID0gKHVpbnQz Ml90KSBwaWQ7CisgIGlmICgoaW50KSBob3N0cGlkICE9IHBpZCkKKyAgICBlcnJvciAoXygiSG9z dCBwcm9jZXNzIGlkIGlzIG5vdCBzdXBwb3J0ZWQuIikpOworCisgIGludCBuZGV2aWNlcyA9IGF0 dGFjaF90b19kZXZpY2VzIChob3N0cGlkKTsKKyAgaWYgKG5kZXZpY2VzID09IDApCisgICAgZXJy b3IgKF8oIk5vIHN1cHBvcnRlZCBkZXZpY2VzIGZvdW5kLiIpKTsKKworICAvKiBMZXQncyBjaGVj ayBpZiB3ZSB3ZXJlIGFibGUgdG8gYXR0YWNoIHRvIGF0IGxlYXN0IG9uZSBkZXZpY2UuICAqLwor ICBpbnQgbmF0dGFjaGVkID0gMDsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKKyAgc3N0 cmVhbSA8PCAiRmFpbGVkIHRvIGF0dGFjaCB0byBhbnkgZGV2aWNlLiI7CisgIGZvciAoemVfZGV2 aWNlX2luZm8gKmRldmljZSA6IGRldmljZXMpCisgICAgeworICAgICAgZ2RiX2Fzc2VydCAoZGV2 aWNlICE9IG51bGxwdHIpOworICAgICAgc3dpdGNoIChkZXZpY2UtPmRlYnVnX2F0dGFjaF9zdGF0 ZSkKKwl7CisJY2FzZSBaRV9SRVNVTFRfU1VDQ0VTUzoKKwkgIGlmIChkZXZpY2UtPnNlc3Npb24g PT0gbnVsbHB0cikKKwkgICAgeworCSAgICAgIHNzdHJlYW0gPDwgIlxuRGV2aWNlICIgPDwgZGV2 aWNlLT5vcmRpbmFsIDw8ICIgWyIKKwkJICAgICAgPDwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUg PDwgIl0gOiAiCisJCSAgICAgIDw8ICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWJ1ZyBzZXNzaW9u IjsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBHREIgKGFuZCBoaWdoZXIgbGF5 ZXJzIG9mIGdkYnNlcnZlcikgZXhwZWN0cyB0aHJlYWRzIHN0b3BwZWQgb24KKwkgICAgIGF0dGFj aCBpbiBhbGwtc3RvcCBtb2RlLiAgSW4gbm9uLXN0b3AgbW9kZSwgR0RCIGV4cGxpY2l0bHkKKwkg ICAgIHNlbmRzIGEgc3RvcCByZXF1ZXN0LiAgKi8KKwkgIGlmICghbm9uX3N0b3ApCisJICAgIHsK KwkgICAgICBkZXZpY2UtPnByb2Nlc3MtPmZvcl9lYWNoX3RocmVhZCAoW3RoaXNdICh0aHJlYWRf aW5mbyAqdHApCisJCXsKKwkJICB6ZV9zZXRfcmVzdW1lX3N0YXRlICh0cCwgcmVzdW1lX3N0b3Ap OworCQkgIGJvb2wgc2hvdWxkX3N0b3AgPSB6ZV9wcmVwYXJlX2Zvcl9zdG9wcGluZyAodHApOwor CQkgIGdkYl9hc3NlcnQgKHNob3VsZF9zdG9wKTsKKwkJfSk7CisKKwkgICAgICB6ZV9kZXZpY2Vf dGhyZWFkX3QgYWxsID0gemVfdGhyZWFkX2lkX2FsbCAoKTsKKwkgICAgICB6ZV9pbnRlcnJ1cHQg KCpkZXZpY2UsIGFsbCk7CisJICAgIH0KKworCSAgbmF0dGFjaGVkICs9IDE7CisJICBicmVhazsK KwljYXNlIFpFX1JFU1VMVF9OT1RfUkVBRFk6CisJICBzc3RyZWFtIDw8ICJcbkRldmljZSAiIDw8 IGRldmljZS0+b3JkaW5hbCA8PCAiIFsiCisJCSAgPDwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUg PDwgIl0gOiAiCisJCSAgPDwgImF0dGVtcHRpbmcgdG8gYXR0YWNoIHRvbyBlYXJseSI7CisJICBi cmVhazsKKwljYXNlIFpFX1JFU1VMVF9FUlJPUl9VTlNVUFBPUlRFRF9GRUFUVVJFOgorCSAgc3N0 cmVhbSA8PCAiXG5EZXZpY2UgIiA8PCBkZXZpY2UtPm9yZGluYWwgPDwgIiBbIgorCQkgIDw8IGRl dmljZS0+cHJvcGVydGllcy5uYW1lIDw8ICJdIDogIgorCQkgIDw8ICJhdHRhY2hpbmcgaXMgbm90 IHN1cHBvcnRlZCI7CisJICBicmVhazsKKwljYXNlIFpFX1JFU1VMVF9FUlJPUl9JTlNVRkZJQ0lF TlRfUEVSTUlTU0lPTlM6CisJICBzc3RyZWFtIDw8ICJcbkRldmljZSAiIDw8IGRldmljZS0+b3Jk aW5hbCA8PCAiIFsiCisJCSAgPDwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUgPDwgIl0gOiAiCisJ CSAgPDwgImF0dGFjaGluZyBpcyBub3QgcGVybWl0dGVkIjsKKwkgIGJyZWFrOworCWNhc2UgWkVf UkVTVUxUX0VSUk9SX05PVF9BVkFJTEFCTEU6CisJICBzc3RyZWFtIDw8ICJcbkRldmljZSAiIDw8 IGRldmljZS0+b3JkaW5hbCA8PCAiIFsiCisJCSAgPDwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUg PDwgIl0gOiAiCisJCSAgPDwgImEgZGVidWdnZXIgaXMgYWxyZWFkeSBhdHRhY2hlZCI7CisJICBi cmVhazsKKwlkZWZhdWx0OgorCSAgc3N0cmVhbSA8PCAiXG5EZXZpY2UgIiA8PCBkZXZpY2UtPm9y ZGluYWwgPDwgIiBbIgorCQkgIDw8IGRldmljZS0+cHJvcGVydGllcy5uYW1lIDw8ICJdIDogIgor CQkgIDw8ICJmYWlsZWQgdG8gYXR0YWNoIHdpdGggZXJyb3IgY29kZSAnIgorCQkgIDw8IHN0ZDo6 aGV4IDw8IGRldmljZS0+ZGVidWdfYXR0YWNoX3N0YXRlCisJCSAgPDwgc3RkOjpyZXNldGlvc2Zs YWdzIChzdGQ6Omlvczo6YmFzZWZpZWxkKQorCQkgIDw8ICInIjsKKwkgIGJyZWFrOworCX0KKyAg ICB9CisKKyAgaWYgKG5hdHRhY2hlZCA9PSAwKQorICAgIGVycm9yIChfKCIlcyIpLCBzc3RyZWFt LnN0ciAoKS5jX3N0ciAoKSk7CisKKyAgLyogSW4gYWxsLXN0b3AgbW9kZSBhYm92ZSwgd2UgaW50 ZXJydXB0ZWQgdGhlIGRldmljZXMuICBOb3cgd2UgbWFrZSBzdXJlCisgICAgIHRoZXkgY29tZSB0 byBhIHN0b3Agc3RhdGUuICBTbywgd2UgZmV0Y2ggZXZlbnRzIHVudGlsIG5vIGRldmljZSBoYXMg YW55CisgICAgIHJlc3VtZWQgdGhyZWFkcyBsZWZ0LiAgVGhlcmUgbWlnaHQgYmUgbG93IHByaW9y aXR5IGV2ZW50cyAoZS5nLgorICAgICAnbW9kdWxlIGxvYWQnLCAncHJvY2VzcyBlbnRyeScpIHdl IHNob3VsZCBmZXRjaCBiZWZvcmUgZmV0Y2hpbmcgaGlnaGVyCisgICAgIHByaW9yaXR5IGV2ZW50 cyBpbiB0aGUgc3Vic2VxdWVudCBjYWxsIG9mICd3YWl0ICgpJy4gIElmIG5vdCBkb25lIGhlcmUs CisgICAgIHdlIGZldGNoIHRoZSBsb3dlciBwcmlvcml0eSBldmVudHMgaW4gJ3dhaXQgKCknLCBy ZXBvcnQgYW4gVU5BVkFJTEFCTEUKKyAgICAgc3RhdHVzIHRvIEdEQiBhbmQgdGhlbiBmZXRjaCB0 aGUgaGlnaGVyIHByaW9yaXR5IGV2ZW50cyBpbiAncGF1c2VfYWxsJy4KKyAgICAgSW4gYSBsaXZl IGF0dGFjaCBzY2VuYXJpbywgd2UgZG9uJ3QgcmVjZWl2ZSBhICdjb250aW51ZScgcmVzdW1lIHJl cXVlc3QKKyAgICAgYW5kIHdvdWxkIG1pc3MgdGhlIHRocmVhZCBzdG9wcGVkIGV2ZW50LiAgKi8K KyAgaWYgKCFub25fc3RvcCkKKyAgICBmZXRjaF9ldmVudHNfYWxsX2RldmljZXNfbm9fcmVzdW1l ZCAoKTsKKworICAvKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBsYXN0IGRldmljZSB3ZSBhdHRhY2hl ZCB0by4gICovCisgIGludCBkZXZpY2VfcGlkID0gemVfZGV2aWNlX3BpZCAoKihkZXZpY2VzLmJh Y2sgKCkpKTsKKyAgcmV0dXJuIGRldmljZV9waWQ7Cit9CisKK2ludAoremVfdGFyZ2V0OjpkZXRh Y2ggKHByb2Nlc3NfaW5mbyAqcHJvYykKK3sKKyAgZ2RiX2Fzc2VydCAocHJvYyAhPSBudWxscHRy KTsKKworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqcHJpdiA9IHByb2MtPnByaXY7CisgIGdkYl9h c3NlcnQgKHByaXYgIT0gbnVsbHB0cik7CisKKyAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9IHBy aXYtPmRldmljZTsKKyAgaWYgKGRldmljZSAhPSBudWxscHRyKQorICAgIHsKKyAgICAgIC8qIFJl c3VtZSBhbGwgdGhlIHRocmVhZHMgb24gdGhlIGRldmljZS4gIEdEQiBtdXN0IGhhdmUgYWxyZWFk eQorCSByZW1vdmVkIGFsbCB0aGUgYnJlYWtwb2ludHMuICAqLworICAgICAgdHJ5CisJeworCSAg LyogQ2xlYXIgYWxsIHRoZSBwZW5kaW5nIGV2ZW50cyBmaXJzdC4gICovCisJICBwcm9jLT5mb3Jf ZWFjaF90aHJlYWQgKFtdICh0aHJlYWRfaW5mbyAqdHApCisJICAgIHsKKwkgICAgICAodm9pZCkg emVfbW92ZV93YWl0c3RhdHVzICh0cCk7CisJICAgIH0pOworCisJICByZXN1bWUgKCpkZXZpY2Up OworCX0KKyAgICAgIGNhdGNoIChjb25zdCBnZGJfZXhjZXB0aW9uX2Vycm9yICZleGNlcHQpCisJ eworCSAgLyogU3dhbGxvdyB0aGUgZXJyb3IuICBXZSBhcmUgZGV0YWNoaW5nIGFueXdheS4gICov CisJICBkcHJpbnRmICgiJXMiLCBleGNlcHQud2hhdCAoKSk7CisJfQorCisgICAgICB6ZV9kZXRh Y2ggKGRldmljZSk7CisgICAgfQorCisgIG1vdXJuIChwcm9jKTsKKyAgcmV0dXJuIDA7Cit9CisK K2ludAoremVfdGFyZ2V0OjpraWxsIChwcm9jZXNzX2luZm8gKnByb2MpCit7CisgIC8qIExldmVs LXplcm8gZG9lcyBub3Qgc3VwcG9ydCBraWxsaW5nIGluZmVyaW9ycy4gICovCisgIHJldHVybiAt MTsKK30KKwordm9pZAoremVfdGFyZ2V0Ojptb3VybiAocHJvY2Vzc19pbmZvICpwcm9jKQorewor ICB6ZV9yZW1vdmVfcHJvY2VzcyAocHJvYyk7Cit9CisKK3ZvaWQKK3plX3RhcmdldDo6am9pbiAo aW50IHBpZCkKK3sKKyAgLyogTm90aGluZyB0byBkbyBmb3IgTGV2ZWwtWmVybyB0YXJnZXRzLiAg Ki8KK30KKwordm9pZAoremVfdGFyZ2V0OjpyZXN1bWUgKHplX2RldmljZV9pbmZvICZkZXZpY2Up Cit7CisgIGdkYl9hc3NlcnQgKGRldmljZS5wcm9jZXNzICE9IG51bGxwdHIpOworCisgIGJvb2wg aGFzX3RocmVhZF90b19yZXN1bWUgPSBmYWxzZTsKKyAgZGV2aWNlLnByb2Nlc3MtPmZvcl9lYWNo X3RocmVhZCAoWyZdICh0aHJlYWRfaW5mbyAqdHApCisgICAgeworICAgICAgemVfc2V0X3Jlc3Vt ZV9zdGF0ZSAodHAsIHJlc3VtZV9jb250aW51ZSk7CisgICAgICBpZiAoemVfcHJlcGFyZV9mb3Jf cmVzdW1pbmcgKHRwKSkKKwl7CisJICBwcmVwYXJlX3RocmVhZF9yZXN1bWUgKHRwKTsKKwkgIHJl Z2NhY2hlX2ludmFsaWRhdGVfdGhyZWFkICh0cCk7CisJICBoYXNfdGhyZWFkX3RvX3Jlc3VtZSA9 IHRydWU7CisJfQorICAgIH0pOworCisgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gcmVzdW1lIGlm IG5vdGhpbmcgaXMgc3RvcHBlZC4gICovCisgIGlmICghaGFzX3RocmVhZF90b19yZXN1bWUpCisg ICAgcmV0dXJuOworCisgIHplX2RldmljZV90aHJlYWRfdCBhbGwgPSB6ZV90aHJlYWRfaWRfYWxs ICgpOworICB6ZV9yZXN1bWUgKGRldmljZSwgYWxsKTsKK30KKwordm9pZAoremVfdGFyZ2V0Ojpy ZXN1bWVfc2luZ2xlX3RocmVhZCAodGhyZWFkX2luZm8gKnRocmVhZCkKK3sKKyAgemVfZGV2aWNl X2luZm8gKmRldmljZSA9IHplX3RocmVhZF9kZXZpY2UgKHRocmVhZCk7CisgIGdkYl9hc3NlcnQg KGRldmljZSAhPSBudWxscHRyKTsKKyAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQg KHRocmVhZCk7CisgIGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKyAgYm9vbCBzaG91 bGRfcmVzdW1lID0gemVfcHJlcGFyZV9mb3JfcmVzdW1pbmcgKHRocmVhZCk7CisgIGdkYl9hc3Nl cnQgKHNob3VsZF9yZXN1bWUpOworICBwcmVwYXJlX3RocmVhZF9yZXN1bWUgKHRocmVhZCk7Cisg IHJlZ2NhY2hlX2ludmFsaWRhdGVfdGhyZWFkICh0aHJlYWQpOworICB6ZV9yZXN1bWUgKCpkZXZp Y2UsIHpldHAtPmlkKTsKK30KKworc2l6ZV90Cit6ZV90YXJnZXQ6Om1hcmtfZXZlbnRpbmdfdGhy ZWFkcyAocHRpZF90IHJlc3VtZV9wdGlkLCByZXN1bWVfa2luZCBya2luZCkKK3sKKyAgLyogTm90 ZSB0aGF0IGV2ZW4gaWYgd2Ugc3RvcHBlZCBhbGwsIHVuYXZhaWxhYmxlIHRocmVhZHMgbWF5IHN0 aWxsCisgICAgIHJlcG9ydCBuZXcgZXZlbnRzIGFzIHdlIHdlcmUgbm90IGFibGUgdG8gc3RvcCB0 aGVtLgorCisgICAgIFdlIGlnbm9yZSB0aG9zZSB0aHJlYWRzIGFuZCB0aGUgdW5hdmFpbGFibGUg ZXZlbnQgdGhleSByZXBvcnQuICAqLworCisgIHNpemVfdCBudW1fZXZlbnRpbmcgPSAwOworICBm b3JfZWFjaF90aHJlYWQgKFs9LCAmbnVtX2V2ZW50aW5nXSAodGhyZWFkX2luZm8gKnRwKQorICAg IHsKKyAgICAgIGlmICghdHAtPmlkLm1hdGNoZXMgKHJlc3VtZV9wdGlkKSkKKwlyZXR1cm47CisK KyAgICAgIGlmICghemVfaGFzX3ByaW9yaXR5X3dhaXRzdGF0dXMgKHRwKSkKKwl7CisJICAodm9p ZCkgemVfbW92ZV93YWl0c3RhdHVzICh0cCk7CisJICByZXR1cm47CisJfQorCisgICAgICB6ZV90 aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworICAgICAgZ2RiX2Fzc2VydCAoemV0 cCAhPSBudWxscHRyKTsKKworICAgICAgLyogSWYgdGhlIHRocmVhZCdzIHN0b3AgZXZlbnQgd2Fz IGJlaW5nIGhlbGQsIGl0IGlzIG5vdyB0aGUgdGltZQorCSB0byBjb252ZXJ0IHRoZSBzdGF0ZSB0 byAnc3RvcHBlZCcgdG8gdW5sZWFzaCB0aGUgZXZlbnQuICAqLworICAgICAgaWYgKHpldHAtPmV4 ZWNfc3RhdGUgPT0gWkVfVEhSRUFEX1NUQVRFX0hFTEQpCisJemV0cC0+ZXhlY19zdGF0ZSA9IFpF X1RIUkVBRF9TVEFURV9TVE9QUEVEOworCisgICAgICAvKiBUUCBtYXkgaGF2ZSBzdG9wcGVkIGF0 IGEgYnJlYWtwb2ludCB0aGF0IGlzIGFscmVhZHkgZGVsZXRlZAorCSBieSBHREIuICBDb25zaWRl ciBUUCBhcyBhbiBldmVudGluZyB0aHJlYWQgb25seSBpZiB0aGUgQlAgaXMKKwkgc3RpbGwgdGhl cmUuICBCZWNhdXNlIHdlIGFyZSBpbnNpZGUgdGhlICdyZXN1bWUnIHJlcXVlc3QsIGlmCisJIHRo ZSBCUCBpcyB2YWxpZCwgR0RCIG11c3QgaGF2ZSBhbHJlYWR5IHJlLWluc2VydGVkIGl0LgorCisJ IEZJWE1FOiBLZWVwIHRyYWNrIG9mIHRoZSBzdG9wX3BjIGFuZCBjb21wYXJlIGl0IHdpdGggdGhl CisJIGN1cnJlbnQgKGkuZS4gdG8tYmUtcmVzdW1lZCkgcGMuICAqLworICAgICAgaWYgKCh6ZXRw LT5leGVjX3N0YXRlID09IFpFX1RIUkVBRF9TVEFURV9TVE9QUEVEKQorCSAgJiYgKHpldHAtPnN0 b3BfcmVhc29uID09IFRBUkdFVF9TVE9QUEVEX0JZX1NXX0JSRUFLUE9JTlQpCisJICAmJiAhaXNf YXRfYnJlYWtwb2ludCAodHApKQorCXsKKwkgIC8qIFRoZSBCUCBpcyBnb25lLiAgQ2xlYXIgdGhl IHdhaXRzdGF0dXMsIHRvby4gICovCisJICB0YXJnZXRfd2FpdHN0YXR1cyB3YWl0c3RhdHVzID0g emVfbW92ZV93YWl0c3RhdHVzICh0cCk7CisJICBpZiAod2FpdHN0YXR1cy5raW5kICgpICE9IFRB UkdFVF9XQUlUS0lORF9TVE9QUEVEKQorCSAgICB3YXJuaW5nIChfKCJ0aHJlYWQgJXMgaGFzIHdh aXRzdGF0dXMgJXMsIGV4cGVjdGVkICdTVE9QUEVEJy4iKSwKKwkJICAgICB0cC0+aWQudG9fc3Ry aW5nICgpLmNfc3RyICgpLAorCQkgICAgIHdhaXRzdGF0dXMudG9fc3RyaW5nICgpLmNfc3RyICgp KTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIFRQIG1heSBoYXZlIHN0b3BwZWQgZHVyaW5n IHJhbmdlLXN0ZXBwaW5nLCBidXQgd2UgcmVwb3J0ZWQKKwkgYW5vdGhlciB0aHJlYWQgdG8gR0RC LiAgVGhpcyBtZWFucyB0aGUgcmFuZ2Utc3RlcHBpbmcgc3RhdGUKKwkgb2YgVFAgaXMgY2FuY2Vs ZWQuCisKKwkgVGhlIGNvbmRpdGlvbiBoZXJlIGlzIHNpbWlsYXIgdG8sIGJ1dCBub3QgdGhlIHNh bWUgYXMKKwkgaXNfcmFuZ2Vfc3RlcHBpbmcuICBXZSBkbyBub3QgY2hlY2sgaGVyZSBpZiB0aGUg dGhyZWFkJ3Mgc3RvcAorCSBwYyBpcyB3aXRoaW4gdGhlIHN0ZXBwaW5nIHJhbmdlLiAgV2UgcmF0 aGVyIG9ubHkgY2hlY2sgaWYgdGhlcmUKKwkgd2FzIGEgcmFuZ2UgdG8gc3RlcCwgYmVjYXVzZSB0 aGUgdGhyZWFkIG1heSBoYXZlIHN0b3BwZWQganVzdAorCSB3aGVuIGl0IGNhbWUgb3V0IG9mIHRo ZSByYW5nZS4gIFdlIHNob3VsZCBjYW5jZWwgdGhlIGV2ZW50IGluCisJIHRoYXQgY2FzZSwgdG9v LiAgKi8KKyAgICAgIGlmICh6ZV90aHJlYWRfc3RvcHBlZCAodHApCisJICAmJiAoemV0cC0+c3Rv cF9yZWFzb24gPT0gVEFSR0VUX1NUT1BQRURfQllfU0lOR0xFX1NURVApCisJICAmJiAoemV0cC0+ c3RlcF9yYW5nZV9lbmQgPiB6ZXRwLT5zdGVwX3JhbmdlX3N0YXJ0KSkKKwl7CisJICB0YXJnZXRf d2FpdHN0YXR1cyB3YWl0c3RhdHVzID0gemVfbW92ZV93YWl0c3RhdHVzICh0cCk7CisJICBkcHJp bnRmICgiVGhyZWFkICVzICglcykgd2FzIHJhbmdlLXN0ZXBwaW5nLCAiCisJCSAgICJjYW5jZWxp bmcgdGhlIHBlbmRpbmcgZXZlbnQiLAorCQkgICB0cC0+aWQudG9fc3RyaW5nICgpLmNfc3RyICgp LAorCQkgICB6ZV90aHJlYWRfaWRfc3RyICh6ZXRwLT5pZCkuY19zdHIgKCkpOworCSAgcmV0dXJu OworCX0KKworICAgICAgLyogUmVjb3ZlciB0aGUgcmVzdW1lIHN0YXRlIHNvIHRoYXQgdGhlIHRo cmVhZCBjYW4gYmUgcGlja2VkIHVwCisJIGJ5ICd3YWl0Jy4gICovCisgICAgICB6ZV9zZXRfcmVz dW1lX3N0YXRlICh0cCwgcmtpbmQpOworICAgICAgbnVtX2V2ZW50aW5nKys7CisgICAgfSk7CisK KyAgZHByaW50ZiAoInRoZXJlIGFyZSAlenUgZXZlbnRpbmcgdGhyZWFkcyBmb3IgcHRpZCAlcyIs IG51bV9ldmVudGluZywKKwkgICByZXN1bWVfcHRpZC50b19zdHJpbmcgKCkuY19zdHIgKCkpOwor CisgIHJldHVybiBudW1fZXZlbnRpbmc7Cit9CisKKy8qIERpc3BsYXkgYSByZXN1bWUgcmVxdWVz dCBmb3IgbG9nZ2luZyBwdXJwb3Nlcy4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9yZXN1bWVf aW5mbyAoY29uc3QgdGhyZWFkX3Jlc3VtZSAmcmluZm8pCit7CisgIHB0aWRfdCBycHRpZCA9IHJp bmZvLnRocmVhZDsKKworICBzd2l0Y2ggKHJpbmZvLmtpbmQpCisgICAgeworICAgIGNhc2UgcmVz dW1lX2NvbnRpbnVlOgorICAgICAgZHByaW50ZiAoInJlY2VpdmVkICdjb250aW51ZScgcmVzdW1l IHJlcXVlc3QgZm9yICglcykiLAorCSAgICAgICBycHRpZC50b19zdHJpbmcgKCkuY19zdHIgKCkp OworICAgICAgcmV0dXJuOworCisgICAgY2FzZSByZXN1bWVfc3RlcDoKKyAgICAgIGRwcmludGYg KCJyZWNlaXZlZCAnc3RlcCcgcmVzdW1lIHJlcXVlc3QgZm9yICglcykiCisJICAgICAgICIgaW4g cmFuZ2UgWzB4JSIgUFJJeDY0ICIsIDB4JSIgUFJJeDY0ICIpIiwKKwkgICAgICAgcnB0aWQudG9f c3RyaW5nICgpLmNfc3RyICgpLAorCSAgICAgICByaW5mby5zdGVwX3JhbmdlX3N0YXJ0LCByaW5m by5zdGVwX3JhbmdlX2VuZCk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIHJlc3VtZV9zdG9w OgorICAgICAgZHByaW50ZiAoInJlY2VpdmVkICdzdG9wJyByZXN1bWUgcmVxdWVzdCBmb3IgKCVz KSIsCisJICAgICAgIHJwdGlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSk7CisgICAgICByZXR1cm47 CisgICAgfQorCisgIGludGVybmFsX2Vycm9yIChfKCJiYWQgcmVzdW1lIGtpbmQ6ICVkLiIpLCBy aW5mby5raW5kKTsKK30KKworLyogTm9ybWFsaXplIHRoZSByZXN1bWUgcmVxdWVzdHMgZm9yIGVh c2llciBwcm9jZXNzaW5nIGxhdGVyIG9uLiAgKi8KKworc3RhdGljIHZvaWQKK25vcm1hbGl6ZV9y ZXN1bWVfaW5mb3MgKHRocmVhZF9yZXN1bWUgKnJlc3VtZV9pbmZvLCBzaXplX3QgbikKK3sKKyAg Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgeworICAgICAgdGhyZWFkX3Jlc3Vt ZSAmcmluZm8gPSByZXN1bWVfaW5mb1tpXTsKKyAgICAgIHB0aWRfdCBycHRpZCA9IHJpbmZvLnRo cmVhZDsKKworICAgICAgLyogTG9nIHRoZSBvcmlnaW5hbCByZXF1ZXN0cy4gICovCisgICAgICBw cmludF9yZXN1bWVfaW5mbyAocmluZm8pOworCisgICAgICAvKiBXZSBjb252ZXJ0IHB0aWRzIG9m IHRoZSBmb3JtIChwLCAtMSwgMCkgdG8gKHAsIDAsIDApIHRvIG1ha2UKKwkgJ3B0aWQubWF0Y2hl cycgd29yay4gIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgc2FmZSBiZWNhdXNlIHdlCisJIGVudW1l cmF0ZSB0aGUgdGhyZWFkcyBzdGFydGluZyBhdCAxLiAgKi8KKyAgICAgIGlmICgocnB0aWQubHdw ICgpID09IC0xKSAmJiAocnB0aWQucGlkICgpID4gMCkpCisJcmluZm8udGhyZWFkID0gcHRpZF90 IChycHRpZC5waWQgKCksIDAsIDApOworCisgICAgICBpZiAocmluZm8uc2lnICE9IDApCisJewor CSAgLyogIENsZWFyIG91dCB0aGUgc2lnbmFsLiAgT3VyIHRhcmdldCBkb2VzIG5vdCBhY2NlcHQK KwkgICAgICBzaWduYWxzLiAgKi8KKwkgIHdhcm5pbmcgKF8oIklnbm9yaW5nIHNpZ25hbCBvbiBy ZXN1bWUgcmVxdWVzdCBmb3IgJXMiKSwKKwkJICAgcmluZm8udGhyZWFkLnRvX3N0cmluZyAoKS5j X3N0ciAoKSk7CisJICByaW5mby5zaWcgPSAwOworCX0KKyAgICB9Cit9CisKKy8qIFJlc3VtaW5n IHRocmVhZHMgb2YgYSBkZXZpY2UgYWxsIGF0IG9uY2Ugd2l0aCBhIHNpbmdsZSBBUEkgY2FsbAor ICAgaXMgcHJlZmVyYWJsZSB0byByZXN1bWluZyB0aHJlYWRzIGluZGl2aWR1YWxseS4gIFRoZXJl Zm9yZSwgd2UKKyAgIHdhbnQgdG8gY29tYmluZSBpbmRpdmlkdWFsIHJlc3VtZSByZXF1ZXN0cyB3 aXRoIHdpbGRjYXJkIHJlc3VtZXMsCisgICBpZiBwb3NzaWJsZS4KKworICAgRm9yIGluc3RhbmNl LCBpZiB3ZSByZWNlaXZlICJ2Q29udDtzOjE7czoyO2MiLCB3ZSB3b3VsZCBsaWtlIHRvCisgICBt YWtlIGEgc2luZ2xlIHplX3Jlc3VtZSBjYWxsIHdpdGggdGhlICdhbGwuYWxsLmFsbC5hbGwnIHRo cmVhZCBpZAorICAgYWZ0ZXIgcHJlcGFyaW5nIHRocmVhZHMgMSBhbmQgMiBmb3Igc3RlcHBpbmcg YW5kIHRoZSBvdGhlcnMgZm9yCisgICBjb250aW51aW5nLgorCisgICBXZSBwcmVwcm9jZXNzIHRo ZSByZXN1bWUgcmVxdWVzdHMgdG8gZmluZCBmb3Igd2hpY2ggZGV2aWNlcyB3ZQorICAgc2hhbGwg Y29tYmluZSB0aGUgcmVxdWVzdHMuICBXZSBhdHRlbXB0IGEgbWVyZ2UgaW4gYWxsLXN0b3AgbW9k ZQorICAgd2hlbiB0aGUgcmVxdWVzdHMgY29udGFpbiBjb250aW51ZS9zdGVwIHJlcXVlc3RzIG9u bHkuICAqLworCitzdGF0aWMgc3RkOjpzZXQ8emVfZGV2aWNlX2luZm8gKj4KK2ZpbmRfd2lsZGNh cmRfZGV2aWNlcyAodGhyZWFkX3Jlc3VtZSAqcmVzdW1lX2luZm8sIHNpemVfdCBuLAorCQkgICAg ICAgY29uc3Qgc3RkOjpsaXN0PHplX2RldmljZV9pbmZvICo+ICZkZXZpY2VzKQoreworICBzdGQ6 OnNldDx6ZV9kZXZpY2VfaW5mbyAqPiB3aWxkY2FyZF9kZXZpY2VzOworCisgIGlmIChub25fc3Rv cCkKKyAgICByZXR1cm4gd2lsZGNhcmRfZGV2aWNlczsKKworICBmb3IgKHNpemVfdCBpID0gMDsg aSA8IG47ICsraSkKKyAgICB7CisgICAgICBpZiAocmVzdW1lX2luZm9baV0ua2luZCA9PSByZXN1 bWVfc3RvcCkKKwl7CisJICB3aWxkY2FyZF9kZXZpY2VzLmNsZWFyICgpOworCSAgYnJlYWs7CisJ fQorCisgICAgICBwdGlkX3QgcnB0aWQgPSByZXN1bWVfaW5mb1tpXS50aHJlYWQ7CisgICAgICBp ZiAocnB0aWQgPT0gbWludXNfb25lX3B0aWQpCisJeworCSAgZm9yICh6ZV9kZXZpY2VfaW5mbyAq ZGV2aWNlIDogZGV2aWNlcykKKwkgICAgd2lsZGNhcmRfZGV2aWNlcy5pbnNlcnQgKGRldmljZSk7 CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChycHRpZC5pc19waWQgKCkpCisJeworCSAgcHJv Y2Vzc19pbmZvICpwcm9jID0gZmluZF9wcm9jZXNzX3BpZCAocnB0aWQucGlkICgpKTsKKwkgIHpl X2RldmljZV9pbmZvICpkZXZpY2UgPSB6ZV9wcm9jZXNzX2RldmljZSAocHJvYyk7CisJICBpZiAo ZGV2aWNlICE9IG51bGxwdHIpCisJICAgIHdpbGRjYXJkX2RldmljZXMuaW5zZXJ0IChkZXZpY2Up OworCX0KKyAgICB9CisKKyAgcmV0dXJuIHdpbGRjYXJkX2RldmljZXM7Cit9CisKK3ZvaWQKK3pl X3RhcmdldDo6cmVzdW1lICh0aHJlYWRfcmVzdW1lICpyZXN1bWVfaW5mbywgc2l6ZV90IG4pCit7 CisgIGlmIChmcm96ZW4pCisgICAgcmV0dXJuOworCisgIC8qIEluIGFsbC1zdG9wIG1vZGUsIGEg bmV3IHJlc3VtZSByZXF1ZXN0IG92ZXJ3cml0ZXMgYW55IHByZXZpb3VzCisgICAgIHJlcXVlc3Qu ICBXZSdyZSBnb2luZyB0byBzZXQgdGhlIHJlcXVlc3QgZm9yIGFmZmVjdGVkIHRocmVhZHMgYmVs b3cuCisgICAgIENsZWFyIGl0IGZvciBhbGwgdGhyZWFkcywgaGVyZS4KKworICAgICBJbiB0aGUg cmVzdW1lLWFsbCBjYXNlLCB0aGlzIHdpbGwgaXRlcmF0ZSBvdmVyIGFsbCB0aHJlYWRzIHR3aWNl IHRvCisgICAgIGZpcnN0IGNsZWFyIGFuZCB0aGVuIHNldCB0aGUgcmVzdW1lIHJlcXVlc3QuICBO b3QgaWRlYWwsIGJ1dCBpZiB3ZQorICAgICBmaXJzdCBpdGVyYXRlZCBvdmVyIGFsbCB0aHJlYWRz IHRvIHNldCB0aGUgcmVzdW1lIHN0YXRlLCB3ZSdkIGFsc28KKyAgICAgaGF2ZSB0byBpdGVyYXRl IG92ZXIgYWxsIHRocmVhZHMgYWdhaW4gaW4gb3JkZXIgdG8gYWN0dWFsbHkgcmVzdW1lCisgICAg IHRoZW0uCisKKyAgICAgQW5kIGlmIHdlIGludmVydGVkIHRoZSBsb29wcyAoaS5lLiBpdGVyYXRl IG92ZXIgdGhyZWFkcywgdGhlbiBvdmVyCisgICAgIHJlc3VtZSByZXF1ZXN0cyksIHdlJ2QgbWlz cyBvdXQgb24gdGhlIG9wcG9ydHVuaXR5IHRvIHJlc3VtZSBhbGwKKyAgICAgdGhyZWFkcyBhdCBv bmNlLiAgKi8KKyAgaWYgKCFub25fc3RvcCkKKyAgICBmb3JfZWFjaF90aHJlYWQgKFtdICh0aHJl YWRfaW5mbyAqdHApCisgICAgICB7CisJemVfY2xlYXJfcmVzdW1lX3N0YXRlICh0cCk7CisgICAg ICB9KTsKKworICBub3JtYWxpemVfcmVzdW1lX2luZm9zIChyZXN1bWVfaW5mbywgbik7CisKKyAg LyogQ2hlY2sgaWYgdGhlcmUgaXMgYSB0aHJlYWQgd2l0aCBhIHBlbmRpbmcgZXZlbnQgZm9yIGFu eSBvZiB0aGUKKyAgICAgcmVzdW1lIHJlcXVlc3RzLiAgSW4gYWxsLXN0b3AgbW9kZSwgd2Ugd291 bGQgb21pdCBhY3R1YWxseQorICAgICByZXN1bWluZyB0aGUgdGFyZ2V0IGlmIHRoZXJlIGlzIHN1 Y2ggYSB0aHJlYWQuICBJbiBub24tc3RvcCBtb2RlLAorICAgICB3ZSBvbWl0IHJlc3VtaW5nIHRo ZSB0aHJlYWQgaXRzZWxmLiAgKi8KKyAgc2l6ZV90IG51bV9ldmVudGluZyA9IDA7CisgIGZvciAo c2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHRocmVhZF9yZXN1 bWUgJnJpbmZvID0gcmVzdW1lX2luZm9baV07CisgICAgICByZXN1bWVfa2luZCBya2luZCA9IHJp bmZvLmtpbmQ7CisgICAgICBwdGlkX3QgcnB0aWQgPSByaW5mby50aHJlYWQ7CisKKyAgICAgIGlm IChya2luZCA9PSByZXN1bWVfc3RvcCkKKwljb250aW51ZTsKKworICAgICAgbnVtX2V2ZW50aW5n ICs9IG1hcmtfZXZlbnRpbmdfdGhyZWFkcyAocnB0aWQsIHJraW5kKTsKKyAgICB9CisKKyAgaWYg KChudW1fZXZlbnRpbmcgPiAwKSAmJiAhbm9uX3N0b3ApCisgICAgcmV0dXJuOworCisgIHN0ZDo6 c2V0PHplX2RldmljZV9pbmZvICo+IHdpbGRjYXJkX2RldmljZXMKKyAgICA9IGZpbmRfd2lsZGNh cmRfZGV2aWNlcyAocmVzdW1lX2luZm8sIG4sIGRldmljZXMpOworCisgIHN0ZDo6c2V0PHplX2Rl dmljZV9pbmZvICo+IGRldmljZXNfdG9fcmVzdW1lOworCisgIC8qIExhbWJkYSBmb3IgYXBwbHlp bmcgYSByZXN1bWUgaW5mbyBvbiBhIHNpbmdsZSB0aHJlYWQuICAqLworICBhdXRvIGFwcGx5X3Jl c3VtZV9pbmZvID0gKFsmXSAoY29uc3QgdGhyZWFkX3Jlc3VtZSAmcmluZm8sCisJCQkJIHRocmVh ZF9pbmZvICp0cCkKKyAgICB7CisgICAgICBpZiAoemVfaGFzX3ByaW9yaXR5X3dhaXRzdGF0dXMg KHRwKSkKKwlyZXR1cm47CisKKyAgICAgIHplX3NldF9yZXN1bWVfc3RhdGUgKHRwLCByaW5mby5r aW5kKTsKKyAgICAgIHplX2RldmljZV9pbmZvICpkZXZpY2UgPSB6ZV90aHJlYWRfZGV2aWNlICh0 cCk7CisgICAgICB6ZV9kZXZpY2VfdGhyZWFkX3QgdGlkID0gemVfdGhyZWFkX2lkICh0cCk7CisK KyAgICAgIHN3aXRjaCAocmluZm8ua2luZCkKKwl7CisJY2FzZSByZXN1bWVfc3RvcDoKKwkgIGlm ICh6ZV9wcmVwYXJlX2Zvcl9zdG9wcGluZyAodHApKQorCSAgICB6ZV9pbnRlcnJ1cHQgKCpkZXZp Y2UsIHRpZCk7CisJICBicmVhazsKKworCWNhc2UgcmVzdW1lX3N0ZXA6CisJICB7CisJICAgIHpl X3RocmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFkICh0cCk7CisJICAgIGdkYl9hc3NlcnQgKHpl dHAgIT0gbnVsbHB0cik7CisKKwkgICAgcmVnY2FjaGUgKnJlZ2NhY2hlCisJICAgICAgPSBnZXRf dGhyZWFkX3JlZ2NhY2hlICh0cCwgLyogZmV0Y2ggPSAqLyB0cnVlKTsKKwkgICAgQ09SRV9BRERS IHBjID0gcmVhZF9wYyAocmVnY2FjaGUpOworCisJICAgIC8qIEZvciBzaW5nbGUtc3RlcHBpbmcs IHN0YXJ0ID09IGVuZC4gIFR5cGljYWxseSwgYm90aCBhcmUgMC4KKwkgICAgICAgRm9yIHJhbmdl LXN0ZXBwaW5nLCB0aGUgUEMgbXVzdCBiZSB3aXRoaW4gdGhlIHJhbmdlLiAgKi8KKwkgICAgQ09S RV9BRERSIHN0YXJ0ID0gcmluZm8uc3RlcF9yYW5nZV9zdGFydDsKKwkgICAgQ09SRV9BRERSIGVu ZCA9IHJpbmZvLnN0ZXBfcmFuZ2VfZW5kOworCSAgICBnZGJfYXNzZXJ0ICgoc3RhcnQgPT0gZW5k KSB8fCAoKHBjID49IHN0YXJ0KSAmJiAocGMgPCBlbmQpKSk7CisKKwkgICAgemV0cC0+c3RlcF9y YW5nZV9zdGFydCA9IHN0YXJ0OworCSAgICB6ZXRwLT5zdGVwX3JhbmdlX2VuZCA9IGVuZDsKKwkg IH0KKworCSAgW1tmYWxsdGhyb3VnaF1dOworCWNhc2UgcmVzdW1lX2NvbnRpbnVlOgorCSAgaWYg KHplX3ByZXBhcmVfZm9yX3Jlc3VtaW5nICh0cCkpCisJICAgIHsKKwkgICAgICBwcmVwYXJlX3Ro cmVhZF9yZXN1bWUgKHRwKTsKKwkgICAgICByZWdjYWNoZV9pbnZhbGlkYXRlX3RocmVhZCAodHAp OworCisJICAgICAgLyogSWYgdGhlIGRldmljZSBjYW4gYmUgcmVzdW1lZCBhcyBhIHdob2xlLAor CQkgb21pdCByZXN1bWluZyB0aGUgdGhyZWFkIGluZGl2aWR1YWxseS4gICovCisJICAgICAgaWYg KHdpbGRjYXJkX2RldmljZXMuY291bnQgKGRldmljZSkgPT0gMCkKKwkJemVfcmVzdW1lICgqZGV2 aWNlLCB0aWQpOworCSAgICAgIGVsc2UKKwkJZGV2aWNlc190b19yZXN1bWUuaW5zZXJ0IChkZXZp Y2UpOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgfSk7CisKKyAgLyogV2UgbWF5IHJlY2Vp dmUgbXVsdGlwbGUgcmVxdWVzdHMgdGhhdCBhcHBseSB0byBhIHRocmVhZC4gIEUuZy4KKyAgICAg InZDb250O3IweGZmMTAsMHhmZmEwOnAxLjk7YyIgY291bGQgYmUgc2VudCB0byBtYWtlIHRocmVh ZCAxLjkgZG8KKyAgICAgcmFuZ2Utc3RlcHBpbmcgZnJvbSAweGZmMTAgdG8gMHhmZmEwLCB3aGls ZSBjb250aW51aW5nIG90aGVycy4KKyAgICAgQWNjb3JkaW5nIHRvIHRoZSBSZW1vdGUgUHJvdG9j b2wgU2VjdGlvbiBFLjIgKFBhY2tldHMpLAorICAgICAiRm9yIGVhY2ggaW5mZXJpb3IgdGhyZWFk LCB0aGUgbGVmdG1vc3QgYWN0aW9uIHdpdGggYSBtYXRjaGluZworICAgICB0aHJlYWQtaWQgaXMg YXBwbGllZC4iICBGb3IgdGhpcyByZWFzb24sIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2gKKyAgICAg dGhyZWFkcyBoYXZlIGJlZW4gcmVzdW1lZCBpbmRpdmlkdWFsbHkgc28gdGhhdCB3ZSBjYW4gc2tp cCB0aGVtCisgICAgIHdoZW4gcHJvY2Vzc2luZyB3aWxkY2FyZCByZXF1ZXN0cy4KKworICAgICBB bHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBoYXZlIHRoZSBvdXRlciBsb29wIGl0ZXJhdGUgb3ZlciB0 aHJlYWRzCisgICAgIGFuZCB0aGUgaW5uZXIgbG9vcCBpdGVyYXRlIG92ZXIgcmVzdW1lIGluZm9z IHRvIGZpbmQgdGhlIGZpcnN0CisgICAgIG1hdGNoaW5nIHJlc3VtZSBpbmZvIGZvciBlYWNoIHRo cmVhZC4gIFRoZXJlIG1heSwgaG93ZXZlciwgYmUgYQorICAgICBsYXJnZSBudW1iZXIgb2YgdGhy ZWFkcyBhbmQgYSBoYW5kZnVsIG9mIHJlc3VtZSBpbmZvcyB0aGF0IGFwcGx5CisgICAgIHRvIGEg ZmV3IHRocmVhZHMgb25seS4gIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSBwcmVmZXIgdG8K KyAgICAgaXRlcmF0ZSBvdmVyIHJlc3VtZSBpbmZvcyBpbiB0aGUgb3V0ZXIgbG9vcC4gICovCisg IHN0ZDo6c2V0PHRocmVhZF9pbmZvICo+IGluZGl2aWR1YWxseV9yZXN1bWVkX3RocmVhZHM7Cisg IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHRocmVh ZF9yZXN1bWUgJnJpbmZvID0gcmVzdW1lX2luZm9baV07CisgICAgICBnZGJfYXNzZXJ0IChyaW5m by5zaWcgPT0gMCk7CisgICAgICBwdGlkX3QgcnB0aWQgPSByaW5mby50aHJlYWQ7CisgICAgICBp bnQgcnBpZCA9IHJwdGlkLnBpZCAoKTsKKyAgICAgIGlmICgocnB0aWQgPT0gbWludXNfb25lX3B0 aWQpCisJICB8fCBycHRpZC5pc19waWQgKCkKKwkgIHx8IChycHRpZC5sd3AgKCkgPT0gLTEpKQor CXsKKwkgIGZvciAoemVfZGV2aWNlX2luZm8gKmRldmljZSA6IGRldmljZXMpCisJICAgIHsKKwkg ICAgICBnZGJfYXNzZXJ0IChkZXZpY2UgIT0gbnVsbHB0cik7CisKKwkgICAgICBpbnQgcGlkID0g emVfZGV2aWNlX3BpZCAoKmRldmljZSk7CisJICAgICAgaWYgKChycGlkICE9IC0xKSAmJiAocnBp ZCAhPSBwaWQpKQorCQljb250aW51ZTsKKworCSAgICAgIGRldmljZS0+cHJvY2Vzcy0+Zm9yX2Vh Y2hfdGhyZWFkIChbJl0gKHRocmVhZF9pbmZvICp0cCkKKwkJeworCQkgIC8qIFdlIHRydXN0IHRo YXQgR0RCIHdpbGwgbm90IHNlbmQgdXMgd2lsZGNhcmQgcmVzdW1lCisJCSAgICAgcmVxdWVzdHMg d2l0aCBvdmVybGFwcGluZyBwaWRzLiAgSGVuY2UsIHdlIHRyYWNrCisJCSAgICAgb25seSBpbmRp dmlkdWFsbHktcmVzdW1lZCB0aHJlYWRzLiAgKi8KKwkJICBpZiAoaW5kaXZpZHVhbGx5X3Jlc3Vt ZWRfdGhyZWFkcy5jb3VudCAodHApID09IDApCisJCSAgICBhcHBseV9yZXN1bWVfaW5mbyAocmlu Zm8sIHRwKTsKKwkJfSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgdGhyZWFkX2lu Zm8gKnRwID0gZmluZF90aHJlYWRfcHRpZCAocnB0aWQpOworCSAgYXBwbHlfcmVzdW1lX2luZm8g KHJpbmZvLCB0cCk7CisJICBpbmRpdmlkdWFsbHlfcmVzdW1lZF90aHJlYWRzLmluc2VydCAodHAp OworCX0KKyAgICB9CisKKyAgLyogRmluYWxseSwgcmVzdW1lIHRoZSB3aG9sZSBkZXZpY2VzLiAg Ki8KKyAgemVfZGV2aWNlX3RocmVhZF90IGFsbCA9IHplX3RocmVhZF9pZF9hbGwgKCk7CisgIGZv ciAoemVfZGV2aWNlX2luZm8gKmRldmljZSA6IGRldmljZXNfdG9fcmVzdW1lKQorICAgIHplX3Jl c3VtZSAoKmRldmljZSwgYWxsKTsKK30KKworLyogTG9vayBmb3IgYSB0aHJlYWQgcHJlZmVyYWJs eSB3aXRoIGEgcHJpb3JpdHkgc3RvcAorICAgZXZlbnQuICBJZiB3ZSBjYW5ub3QgZmluZCBzdWNo IGFuIGV2ZW50LCB3ZSBsb29rIGZvciBhbgorICAgaW50ZXJydXB0LXJlbGF0ZWQgc3RvcCBldmVu dCwgZS5nLiAgYSBzdG9wIGJlY2F1c2Ugb2YgYW4KKyAgIGV4dGVybmFsIEN0cmwtQyBvciBhbiBp bnRlcm5hbCBwYXVzZV9hbGwgcmVxdWVzdC4gIFdlIHBpY2sKKyAgIGEgVEhSRUFEX1VOQVZBSUxB QkxFIGV2ZW50IGZvciByZXBvcnRpbmcgYXMgdGhlIGxhc3QgcmVzb3J0LgorCisgICBXZSBmaXJz dCBtYWtlIGFuIGl0ZXJhdGlvbiBvdmVyIHRoZSB0aHJlYWRzIHRvIGZpZ3VyZSBvdXQKKyAgIHdo YXQga2luZCBvZiBhbiBldmVudCB3ZSBjYW4gcmVwb3J0LiAgT25jZSBmb3VuZCwgd2Ugc2VsZWN0 CisgICBhIHRocmVhZCByYW5kb21seS4KKworICAgSW4gYWxsLXN0b3AgbW9kZSwgd2Ugd2lsbCBp Z25vcmUgdW5hdmFpbGFibGUgdGhyZWFkcyB3aGVuCisgICByZXN1bWluZyB0aGUgdGFyZ2V0LiAg U28sIHVubGVzcyB3ZSBleHBsaWNpdGx5IHRyeSB0byBpbnRlcmFjdAorICAgd2l0aCB0aGVtLCB1 bmF2YWlsYWJsZSB0aHJlYWRzIHNob3VsZCBiZSB0cmFuc3BhcmVudCB0byBhbgorICAgYWxsLXN0 b3AgdGFyZ2V0LgorCisgICBJbiBub24tc3RvcCBtb2RlLCB3ZSBnaXZlIG1vcmUgdGltZSBmb3Ig dW5hdmFpbGFibGUgdGhyZWFkcyB0bworICAgYmVjb21lIGF2YWlsYWJsZSBhbmQgcmVwb3J0IGFu IGV2ZW50LiAgKi8KKworc3RhdGljIHRocmVhZF9pbmZvICoKK3plX2ZpbmRfZXZlbnRpbmdfdGhy ZWFkIChwdGlkX3QgcHRpZCkKK3sKKyAgdXNpbmcgdGhyZWFkX3ByZWRpY2F0ZSA9IGJvb2wgKCop IChjb25zdCB0aHJlYWRfaW5mbyAqKTsKKyAgdGhyZWFkX3ByZWRpY2F0ZSBpc19zdG9wcGVkID0g W10gKGNvbnN0IHRocmVhZF9pbmZvICp0cCkKKyAgeworICAgIHJldHVybiAoemVfdGhyZWFkICh0 cCktPndhaXRzdGF0dXMua2luZCAoKSA9PSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRCk7CisgIH07 CisKKyAgdGhyZWFkX3ByZWRpY2F0ZSBwcmVkaWNhdGUgPSBudWxscHRyOworICBmaW5kX3RocmVh ZCAocHRpZCwgWyZdICh0aHJlYWRfaW5mbyAqdHApCisgICAgeworICAgICAgLyogT25seSBjb25z aWRlciB0aHJlYWRzIHRoYXQgd2VyZSByZXN1bWVkLiAgKi8KKyAgICAgIHplX3RocmVhZF9yZXN1 bWVfc3RhdGVfdCBzdGF0ZSA9IHplX3Jlc3VtZV9zdGF0ZSAodHApOworICAgICAgaWYgKHN0YXRl ID09IFpFX1RIUkVBRF9SRVNVTUVfTk9ORSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIElm IHRoaXMgdGhyZWFkJ3MgZXZlbnQgaXMgYmVpbmcgaGVsZCwgd2UgZG8gbm90IHBpY2sgaXQgZm9y CisJIHJlcG9ydGluZy4gICovCisgICAgICB6ZV90aHJlYWRfZXhlY19zdGF0ZV90IGV4ZWNfc3Rh dGUgPSB6ZV9leGVjX3N0YXRlICh0cCk7CisgICAgICBpZiAoZXhlY19zdGF0ZSA9PSBaRV9USFJF QURfU1RBVEVfSEVMRCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICh6ZV9oYXNfcHJpb3Jp dHlfd2FpdHN0YXR1cyAodHApKQorCXsKKwkgIHByZWRpY2F0ZSA9IHplX2hhc19wcmlvcml0eV93 YWl0c3RhdHVzOworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBpZiAoaXNfc3RvcHBlZCAo dHApKQorCXByZWRpY2F0ZSA9IGlzX3N0b3BwZWQ7CisgICAgICBlbHNlIGlmICgocHJlZGljYXRl ID09IG51bGxwdHIpICYmIHplX2hhc193YWl0c3RhdHVzICh0cCkpCisJcHJlZGljYXRlID0gemVf aGFzX3dhaXRzdGF0dXM7CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9KTsKKworICB0aHJl YWRfaW5mbyAqdGhyZWFkID0gbnVsbHB0cjsKKyAgaWYgKHByZWRpY2F0ZSAhPSBudWxscHRyKQor ICAgIHRocmVhZCA9IGZpbmRfdGhyZWFkX2luX3JhbmRvbSAocHRpZCwgW3ByZWRpY2F0ZV0gKHRo cmVhZF9pbmZvICp0cCkKKyAgICAgIHsKKwkvKiBPbmx5IGNvbnNpZGVyIHRocmVhZHMgdGhhdCB3 ZXJlIHJlc3VtZWQuICAqLworCXplX3RocmVhZF9yZXN1bWVfc3RhdGVfdCBzdGF0ZSA9IHplX3Jl c3VtZV9zdGF0ZSAodHApOworCWlmIChzdGF0ZSA9PSBaRV9USFJFQURfUkVTVU1FX05PTkUpCisJ ICByZXR1cm4gZmFsc2U7CisKKwkvKiBUaHJlYWRzIHdpdGggaGVsZCBldmVudHMgYXJlIG5vdCBw aWNrZWQuICAqLworCXplX3RocmVhZF9leGVjX3N0YXRlX3QgZXhlY19zdGF0ZSA9IHplX2V4ZWNf c3RhdGUgKHRwKTsKKwlpZiAoZXhlY19zdGF0ZSA9PSBaRV9USFJFQURfU1RBVEVfSEVMRCkKKwkg IHJldHVybiBmYWxzZTsKKworCXJldHVybiBwcmVkaWNhdGUgKHRwKTsKKyAgICAgIH0pOworICBy ZXR1cm4gdGhyZWFkOworfQorCitwdGlkX3QKK3plX3RhcmdldDo6d2FpdCAocHRpZF90IHB0aWQs IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXMsCisJCSB0YXJnZXRfd2FpdF9mbGFncyBvcHRpb25z KQoreworICAvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIGZ1cnRoZXIgZXZlbnRzLiAgKi8KKyAgemVf YXN5bmNfbWFyayAoKTsKKworICBkbworICAgIHsKKyAgICAgIC8qIFdlIHN0YXJ0IGJ5IGZldGNo aW5nIGFsbCBldmVudHMuCisKKwkgVGhpcyB3aWxsIG1hcmsgdGhyZWFkcyBzdG9wcGVkIGFuZCBh bHNvIHByb2Nlc3Mgc29saXN0IHVwZGF0ZXMuICBXZSBtYXkKKwkgZ2V0IHNvbGlzdCB1cGRhdGVz IGV2ZW4gaWYgYWxsIGRldmljZSB0aHJlYWRzIGFyZSBydW5uaW5nLgorCisJIEZvciBhbGwtc3Rv cCwgd2UgYW55d2F5IHdhbnQgdG8gc3RvcCBhbGwgdGhyZWFkcyBhbmQgZHJhaW4gZXZlbnRzCisJ IGJlZm9yZSByZXBvcnRpbmcgdGhlIHN0b3AgdG8gR0RCLgorCisJIEZvciBub24tc3RvcCwgdGhp cyB3aWxsIGFsbG93IHVzIHRvIGdyb3VwIHN0b3AgZXZlbnRzIGZvciBtdWx0aXBsZQorCSB0aHJl YWRzLiAgKi8KKyAgICAgIHVpbnQ2NF90IG5ldmVudHM7CisgICAgICBkbworCXsKKwkgIG5ldmVu dHMgPSAwOworCisJICBmb3IgKHplX2RldmljZV9pbmZvICpkZXZpY2UgOiBkZXZpY2VzKQorCSAg ICB7CisJICAgICAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCSAgICAgIC8qIEZl dGNoIGZyb20gYW55IGRldmljZSwgcmVnYXJkbGVzcyBvZiBQVElELCBzbyB0aGF0IHdlCisJCSBk cmFpbiB0aGUgZXZlbnQgcXVldWVzIGFzIG11Y2ggYXMgcG9zc2libGUuICBXZSB1c2UKKwkJIFBU SUQgZG93biBiZWxvdyB0byBmaWx0ZXIgdGhlIGV2ZW50cyBhbnl3YXkuICAqLworCSAgICAgIG5l dmVudHMgKz0gZmV0Y2hfZXZlbnRzICgqZGV2aWNlKTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxl IChuZXZlbnRzID4gMCk7CisKKyAgICAgIC8qIE5leHQsIGZpbmQgYSBtYXRjaGluZyBlbnRpdHks IHdob3NlIGV2ZW50IHdlJ2xsIHJlcG9ydC4KKworCSBXZSBwcmlvcml0aXplIHByb2Nlc3MgZXZl bnRzIHNpbmNlIHRoZXkgYXJlIHR5cGljYWxseSBhIGxvdCByYXJlciBhbmQKKwkgZnVydGhlciBo YXZlIGhpZ2hlciBpbXBhY3QgYW5kIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBhbnkgdGhyZWFk CisJIGV2ZW50cyBvZiB0aGF0IHByb2Nlc3MuCisKKwkgUHJvY2VzcyBldmVudHMgYXJlIG5vIHN0 b3AgZXZlbnRzLiAgVGhleSBsZWF2ZSB0aHJlYWRzIHJ1bm5pbmcsCisJIGV2ZW4gaW4gYWxsLXN0 b3AgbW9kZS4gICovCisgICAgICBwcm9jZXNzX2luZm8gKnByb2Nlc3MKKwk9IGZpbmRfcHJvY2Vz cyAoW3B0aWQsIHRoaXNdIChwcm9jZXNzX2luZm8gKnByb2MpCisJICB7CisJICAgIGlmICghcHRp ZF90IChwcm9jLT5waWQpLm1hdGNoZXMgKHB0aWQpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwor CSAgICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqemVwcm9jID0gcHJvYy0+cHJpdjsKKwkgICAgZ2Ri X2Fzc2VydCAoemVwcm9jICE9IG51bGxwdHIpOworCisJICAgIHJldHVybiAoemVwcm9jLT53YWl0 c3RhdHVzLmtpbmQgKCkgIT0gVEFSR0VUX1dBSVRLSU5EX0lHTk9SRSk7CisJICB9KTsKKworICAg ICAgLyogSWYgd2UgZm91bmQgYSBwcm9jZXNzIGV2ZW50LCBpdCBpcyBvdXIgcHJpbWFyeSBjYW5k aWRhdGUuCisKKwkgUHJvY2VzcyBldmVudHMgd2l0aCBhIGxvdyBwcmlvcml0eSBVTkFWQUlMQUJM RSB3YWl0c3RhdHVzIGRvIG5vdAorCSBzdG9wIHRoZSB0YXJnZXQgaW4gYWxsLXN0b3AsIGJ1dCBz b21lIG9mIGl0cyB0aHJlYWRzIG1pZ2h0IGhhdmUgYQorCSBwZW5kaW5nIHdhaXRzdGF0dXMsIHdo aWNoIHJlcXVpcmVzIHRoZSBzdG9wLiAgSWYgc3VjaCBUSFJFQUQgaXMKKwkgZm91bmQsIHdlIHBy aW9yaXRpemUgaXQsIGNsZWFuIHRoZSBwcm9jZXNzIHdhaXRzdGF0dXMsIGFuZCBmYWxsCisJIHRo cm91Z2ggdG8gdGhlIHRocmVhZCByZXBvcnRpbmcuICBUaGUgcHJvY2VzcyBldmVudCB3aWxsCisJ IHBpZ2d5YmFjayBvbiBpdC4KKworCSBXZSBkbyBub3QgdGFrZSBhbnkgc3BlY2lhbCBjYXJlIGFi b3V0IGZhaXJuZXNzIGFzIHdlIGV4cGVjdCBwcm9jZXNzCisJIGV2ZW50cyB0byBiZSByYXRoZXIg cmFyZS4gICovCisgICAgICB0aHJlYWRfaW5mbyAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICAgIGlm IChwcm9jZXNzICE9IG51bGxwdHIpCisJeworCSAgcHJvY2Vzc19pbmZvX3ByaXZhdGUgKnplcHJv YyA9IHByb2Nlc3MtPnByaXY7CisJICBnZGJfYXNzZXJ0ICh6ZXByb2MgIT0gbnVsbHB0cik7CisJ ICBwdGlkX3QgcHJvY2Vzc19wdGlkID0gcHRpZF90IChwcm9jZXNzLT5waWQpOworCisJICAvKiBJ ZiB3ZSBnb3QgYW4gdW5hdmFpbGFibGUgcHJvY2VzcyBldmVudCwgdHJ5IHRvIGZpbmQgYW5vdGhl cgorCSAgICAgZXZlbnRpbmcgdGhyZWFkIGZvciB0aGlzIHByb2Nlc3MuICAqLworCSAgaWYgKHpl cHJvYy0+d2FpdHN0YXR1cy5raW5kICgpID09IFRBUkdFVF9XQUlUS0lORF9VTkFWQUlMQUJMRSkK KwkgICAgdGhyZWFkID0gemVfZmluZF9ldmVudGluZ190aHJlYWQgKHByb2Nlc3NfcHRpZCk7CisK KwkgIC8qIElmIG5vdCBmb3VuZCwgcmV0dXJuIHRoZSBwcm9jZXNzIGFuZCBjbGVhbiBpdHMgd2Fp dHN0YXR1cy4gICovCisJICBpZiAodGhyZWFkID09IG51bGxwdHIpCisJICAgIHsKKwkgICAgICAq c3RhdHVzID0gemVwcm9jLT53YWl0c3RhdHVzOworCSAgICAgIHplcHJvYy0+d2FpdHN0YXR1cy5z ZXRfaWdub3JlICgpOworCisJICAgICAgcmV0dXJuIHByb2Nlc3NfcHRpZDsKKwkgICAgfQorCisJ ICAvKiBUSFJFQUQgc2hvdWxkIGFsd2F5cyBtYXRjaCB0aGUgUFRJRDogd2UgZ290IGEgcHJvY2Vz cyBldmVudCwKKwkgICAgIHNvIFBUSUQgbXVzdCBiZSBlaXRoZXIgbWludXNfb25lIG9yIHRoZSBw cm9jZXNzJ3MgcHRpZC4gICovCisJICBnZGJfYXNzZXJ0ICh0aHJlYWQtPmlkLm1hdGNoZXMgKHB0 aWQpKTsKKworCSAgLyogVGhlIHByb2Nlc3MgZXZlbnQgd2lsbCBwaWdneWJhY2sgb250byB0aGUg VEhSRUFEIGV2ZW50LgorCSAgICAgSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBjbGVhbiB0aGUg cHJvY2VzcyBzdGF0dXMuICAqLworCSAgemVwcm9jLT53YWl0c3RhdHVzLnNldF9pZ25vcmUgKCk7 CisJfQorCisgICAgICAvKiBJZiB3ZSBoYXZlIHByZXZpb3VzbHkgZm91bmQgVEhSRUFEIGZvciB0 aGUgUFJPQ0VTUywgd2UgdXNlIGl0LgorICAgICAgICAgT3RoZXJ3aXNlLCBwcm9jZWVkIHdpdGgg c2VhcmNoaW5nIGZvciBhIHRocmVhZCBldmVudCBmb3IgUFRJRC4gICovCisgICAgICBpZiAodGhy ZWFkID09IG51bGxwdHIpCisJdGhyZWFkID0gemVfZmluZF9ldmVudGluZ190aHJlYWQgKHB0aWQp OworCisgICAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpCisJeworCSAgemVfdGhyZWFkX2luZm8g KnpldHAgPSB6ZV90aHJlYWQgKHRocmVhZCk7CisJICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxw dHIpOworCisJICBpZiAoaXNfcmFuZ2Vfc3RlcHBpbmcgKHRocmVhZCkpCisJICAgIHsKKwkgICAg ICAvKiBXZSBhcmUgaW5zaWRlIHRoZSBzdGVwcGluZyByYW5nZS4gIFJlc3VtZSB0aGUgdGhyZWFk CisJCSBhbmQgZ28gYmFjayB0byBmZXRjaGluZyBldmVudHMuICAqLworCSAgICAgIGRwcmludGYg KCJ0aHJlYWQgJXMgaXMgc3RlcHBpbmcgaW4gcmFuZ2UgIgorCQkgICAgICAgIlsweCUiIFBSSXg2 NCAiLCAweCUiIFBSSXg2NCAiKSIsCisJCSAgICAgICB6ZV90aHJlYWRfaWRfc3RyICh6ZXRwLT5p ZCkuY19zdHIgKCksCisJCSAgICAgICB6ZXRwLT5zdGVwX3JhbmdlX3N0YXJ0LCB6ZXRwLT5zdGVw X3JhbmdlX2VuZCk7CisKKwkgICAgICB6ZXRwLT53YWl0c3RhdHVzLnNldF9pZ25vcmUgKCk7CisJ ICAgICAgZ2RiX2Fzc2VydCAoemV0cC0+cmVzdW1lX3N0YXRlID09IFpFX1RIUkVBRF9SRVNVTUVf U1RFUCk7CisKKwkgICAgICByZXN1bWVfc2luZ2xlX3RocmVhZCAodGhyZWFkKTsKKwkgICAgICBj b250aW51ZTsKKwkgICAgfQorCisJICAvKiBSZXN1bWUgYW55IHRocmVhZCB3ZSBkaWRuJ3Qgd2Fu dCBzdG9wcGVkLiAgKi8KKwkgIGlmICgoemV0cC0+c3RvcF9yZWFzb24gPT0gVEFSR0VUX1NUT1BQ RURfQllfTk9fUkVBU09OKQorCSAgICAgICYmICh6ZXRwLT53YWl0c3RhdHVzLmtpbmQgKCkgPT0g VEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQpCisJICAgICAgJiYgKHpldHAtPndhaXRzdGF0dXMuc2ln ICgpID09IEdEQl9TSUdOQUxfMCkpCisJICAgIHsKKwkgICAgICBkcHJpbnRmICgic2lsZW50bHkg cmVzdW1pbmcgdGhyZWFkICVzICglcykiLAorCQkgICAgICAgdGhyZWFkLT5pZC50b19zdHJpbmcg KCkuY19zdHIgKCksCisJCSAgICAgICB6ZV90aHJlYWRfaWRfc3RyICh6ZXRwLT5pZCkuY19zdHIg KCkpOworCisJICAgICAgLyogVW5kbyBhbnkgcHJldmlvdXMgaG9sZGluZyBvZiB0aGUgZXZlbnQu ICAqLworCSAgICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfU1RPUFBFRDsK KwkgICAgICB6ZXRwLT53YWl0c3RhdHVzLnNldF9pZ25vcmUgKCk7CisJICAgICAgemVfc2V0X3Jl c3VtZV9zdGF0ZSAodGhyZWFkLCByZXN1bWVfY29udGludWUpOworCisJICAgICAgcmVzdW1lX3Np bmdsZV90aHJlYWQgKHRocmVhZCk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyog U3RvcCBhbGwgb3RoZXIgdGhyZWFkcy4KKworCSAgICAgU2F2ZSB0aGUgd2FpdHN0YXR1cyBiZWZv cmUsIGJlY2F1c2UgcGF1c2VfYWxsIGNsZWFycyBhbGwKKwkgICAgIGxvdy1wcmlvcml0eSBldmVu dHMuICAqLworCSAgKnN0YXR1cyA9IHpldHAtPndhaXRzdGF0dXM7CisKKwkgIGlmICghbm9uX3N0 b3ApCisJICAgIHBhdXNlX2FsbCAoZmFsc2UpOworCisJICAvKiBOb3cgYWxzbyBjbGVhciB0aGUg dGhyZWFkJ3MgZXZlbnQsIHJlZ2FyZGxlc3Mgb2YgaXRzCisJICAgICBwcmlvcml0eS4gICovCisJ ICB6ZXRwLT53YWl0c3RhdHVzLnNldF9pZ25vcmUgKCk7CisJICB6ZXRwLT5zdGVwX3JhbmdlX3N0 YXJ0ID0gMDsKKwkgIHpldHAtPnN0ZXBfcmFuZ2VfZW5kID0gMDsKKworCSAgLyogRklYTUU6IHN3 aXRjaF90b190aHJlYWQKKworCSAgICAgV2h5IGlzbid0IHRoZSBjYWxsZXIgc3dpdGNoaW5nIGJh c2VkIG9uIHRoZSByZXR1cm5lZCBwdGlkPyAgKi8KKwkgIHN3aXRjaF90b190aHJlYWQgKHRocmVh ZCk7CisJICByZXR1cm4gdGhyZWFkLT5pZDsKKwl9CisKKyAgICAgIHN0ZDo6dGhpc190aHJlYWQ6 OnlpZWxkICgpOworICAgIH0KKyAgd2hpbGUgKChvcHRpb25zICYgVEFSR0VUX1dOT0hBTkcpID09 IDApOworCisgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBmaW5kIGFueSBldmVu dCB0byByZXBvcnQuICAqLworCisgIHN0YXR1cy0+c2V0X2lnbm9yZSAoKTsKKyAgcmV0dXJuIG51 bGxfcHRpZDsKK30KKwordm9pZAoremVfdGFyZ2V0OjpmZXRjaF9yZWdpc3RlcnMgKHJlZ2NhY2hl ICpyZWdjYWNoZSwgaW50IHJlZ25vKQoreworICB6ZV9kZXZpY2VfdGhyZWFkX3QgdGlkID0gemVf dGhyZWFkX2lkIChyZWdjYWNoZS0+dGhyZWFkKTsKKyAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9 IHplX3RocmVhZF9kZXZpY2UgKHJlZ2NhY2hlLT50aHJlYWQpOworICBnZGJfYXNzZXJ0IChkZXZp Y2UgIT0gbnVsbHB0cik7CisKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHplX2ZldGNoX2FsbF9y ZWdpc3RlcnMgKCpkZXZpY2UsIHRpZCwgcmVnY2FjaGUpOworICBlbHNlCisgICAgemVfZmV0Y2hf cmVnaXN0ZXIgKCpkZXZpY2UsIHRpZCwgcmVnY2FjaGUsIHJlZ25vKTsKK30KKwordm9pZAoremVf dGFyZ2V0OjpzdG9yZV9yZWdpc3RlcnMgKHJlZ2NhY2hlICpyZWdjYWNoZSwgaW50IHJlZ25vKQor eworICB6ZV9kZXZpY2VfdGhyZWFkX3QgdGlkID0gemVfdGhyZWFkX2lkIChyZWdjYWNoZS0+dGhy ZWFkKTsKKyAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9IHplX3RocmVhZF9kZXZpY2UgKHJlZ2Nh Y2hlLT50aHJlYWQpOworICBnZGJfYXNzZXJ0IChkZXZpY2UgIT0gbnVsbHB0cik7CisKKyAgaWYg KHJlZ25vID09IC0xKQorICAgIHplX3N0b3JlX2FsbF9yZWdpc3RlcnMgKCpkZXZpY2UsIHRpZCwg cmVnY2FjaGUpOworICBlbHNlCisgICAgemVfc3RvcmVfcmVnaXN0ZXIgKCpkZXZpY2UsIHRpZCwg cmVnY2FjaGUsIHJlZ25vKTsKK30KKworLyogRGV0ZXJtaW5lIHRoZSB0aHJlYWQgaWQgYW5kIGRl dmljZSBjb250ZXh0IGZvciBhY2Nlc3NpbmcgQUREUl9TUEFDRQorICAgZnJvbSBUSFJFQUQuICAq Lworc3RhdGljIHN0ZDo6cGFpcjx6ZV9kZXZpY2VfdGhyZWFkX3QsIHplX2RldmljZV9pbmZvICo+ Cit6ZV9tZW1vcnlfYWNjZXNzX2NvbnRleHQgKHRocmVhZF9pbmZvICp0aHJlYWQsIHVuc2lnbmVk IGludCBhZGRyX3NwYWNlKQoreworICAvKiBXaXRoIGEgc3RvcHBlZCB0aHJlYWQsIHdlIGNhbiBh Y2Nlc3MgYWxsIGFkZHJlc3Mgc3BhY2VzLCBhbmQgd2UKKyAgICAgc2hvdWxkIGJlIGFibGUgdG8g ZGV0ZXJtaW5lIHRoZSBkZXZpY2UgZm9yIHRoYXQgdGhyZWFkLiAgKi8KKyAgaWYgKHplX3RocmVh ZF9zdG9wcGVkICh0aHJlYWQpKQorICAgIHJldHVybiBzdGQ6OnBhaXI8emVfZGV2aWNlX3RocmVh ZF90LCB6ZV9kZXZpY2VfaW5mbyAqPgorICAgICAgeyB6ZV90aHJlYWRfaWQgKHRocmVhZCksIHpl X3RocmVhZF9kZXZpY2UgKHRocmVhZCkgfTsKKworICAvKiBXaXRob3V0IGEgc3RvcHBlZCB0aHJl YWQsIHdlIG1heSBvbmx5IGFjY2VzcyB0aGUgZGVmYXVsdCBhZGRyZXNzCisgICAgIHNwYWNlIGFu ZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIHRocmVhZCBBTEwuICAqLworICBpZiAoYWRkcl9zcGFj ZSAhPSBaRVRfREVCVUdfTUVNT1JZX1NQQUNFX1RZUEVfREVGQVVMVCkKKyAgICBlcnJvciAoXygi bmVlZCB0aHJlYWQgdG8gYWNjZXNzIG5vbi1kZWZhdWx0IGFkZHJlc3Mgc3BhY2UuIikpOworCisg IC8qIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRldmljZSB1c2luZyBUSFJFQUQgYnV0IGZhbGwgYmFj ayB0byB0aGUgY3VycmVudAorICAgICBwcm9jZXNzJyBkZXZpY2UsIGUuZy4gaWYgVEhSRUFEIGlz IG51bGxwdHIuICAqLworICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gemVfdGhyZWFkX2Rldmlj ZSAodGhyZWFkKTsKKyAgaWYgKGRldmljZSA9PSBudWxscHRyKQorICAgIHsKKyAgICAgIHByb2Nl c3NfaW5mbyAqcHJvY2VzcyA9IGN1cnJlbnRfcHJvY2VzcyAoKTsKKyAgICAgIGRldmljZSA9IHpl X3Byb2Nlc3NfZGV2aWNlIChwcm9jZXNzKTsKKworICAgICAgaWYgKGRldmljZSA9PSBudWxscHRy KQorCWVycm9yIChfKCJjYW5ub3QgZGV0ZXJtaW5lIGRldmljZSBmb3IgbWVtb3J5IGFjY2Vzcy4i KSk7CisgICAgfQorCisgIHJldHVybiBzdGQ6OnBhaXI8emVfZGV2aWNlX3RocmVhZF90LCB6ZV9k ZXZpY2VfaW5mbyAqPgorICAgIHsgemVfdGhyZWFkX2lkX2FsbCAoKSwgZGV2aWNlIH07Cit9CisK K2ludAoremVfdGFyZ2V0OjpyZWFkX21lbW9yeSAodGhyZWFkX2luZm8gKnRwLCBDT1JFX0FERFIg bWVtYWRkciwKKwkJCXVuc2lnbmVkIGNoYXIgKm15YWRkciwgaW50IGxlbikKK3sKKyAgdW5zaWdu ZWQgaW50IGFkZHJfc3BhY2UgPSAwOyAvKiBPbmx5IHRoZSBkZWZhdWx0IHNwYWNlIGZvciBub3cu ICAqLworICB6ZXRfZGVidWdfbWVtb3J5X3NwYWNlX2Rlc2NfdCBkZXNjOworCisgIG1lbXNldCAo JmRlc2MsIDAsIHNpemVvZiAoZGVzYykpOworICBkZXNjLnN0eXBlID0gWkVUX1NUUlVDVFVSRV9U WVBFX0RFQlVHX01FTU9SWV9TUEFDRV9ERVNDOworICBkZXNjLnBOZXh0ID0gbnVsbHB0cjsKKyAg ZGVzYy50eXBlID0gKHpldF9kZWJ1Z19tZW1vcnlfc3BhY2VfdHlwZV90KSBhZGRyX3NwYWNlOwor ICBkZXNjLmFkZHJlc3MgPSAodWludDY0X3QpIG1lbWFkZHI7CisKKyAgc3RkOjpwYWlyPHplX2Rl dmljZV90aHJlYWRfdCwgemVfZGV2aWNlX2luZm8gKj4gY29udGV4dAorICAgID0gemVfbWVtb3J5 X2FjY2Vzc19jb250ZXh0ICh0cCwgYWRkcl9zcGFjZSk7CisgIHplX2RldmljZV90aHJlYWRfdCB0 aHJlYWQgPSBjb250ZXh0LmZpcnN0OworICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gY29udGV4 dC5zZWNvbmQ7CisgIGdkYl9hc3NlcnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICB6ZV9yZXN1 bHRfdCBzdGF0dXMgPSB6ZXREZWJ1Z1JlYWRNZW1vcnkgKGRldmljZS0+c2Vzc2lvbiwgdGhyZWFk LCAmZGVzYywKKwkJCQkJICAgbGVuLCBteWFkZHIpOworICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7 CisgICAgY2FzZSBaRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgIHJldHVybiAwOworCisgICAgZGVm YXVsdDoKKyAgICAgIGRwcmludGYgKCJlcnJvciByZWFkaW5nICVkIGJ5dGVzIG9mIG1lbW9yeSBm cm9tICVzIHdpdGggJXM6ICV4IiwKKwkgICAgICAgbGVuLCBjb3JlX2FkZHJfdG9fc3RyaW5nX256 IChtZW1hZGRyKSwKKwkgICAgICAgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwg c3RhdHVzKTsKKworICAgICAgcmV0dXJuIEVJTzsKKyAgICB9Cit9CisKK2ludAoremVfdGFyZ2V0 OjpyZWFkX21lbW9yeSAoQ09SRV9BRERSIG1lbWFkZHIsIHVuc2lnbmVkIGNoYXIgKm15YWRkciwg aW50IGxlbikKK3sKKyAgcmV0dXJuIHJlYWRfbWVtb3J5IChjdXJyZW50X3RocmVhZCwgbWVtYWRk ciwgbXlhZGRyLCBsZW4pOworfQorCitpbnQKK3plX3RhcmdldDo6d3JpdGVfbWVtb3J5ICh0aHJl YWRfaW5mbyAqdHAsIENPUkVfQUREUiBtZW1hZGRyLAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIg Km15YWRkciwgaW50IGxlbikKK3sKKyAgdW5zaWduZWQgaW50IGFkZHJfc3BhY2UgPSAwOyAvKiBP bmx5IHRoZSBkZWZhdWx0IHNwYWNlIGZvciBub3cuICAqLworICB6ZXRfZGVidWdfbWVtb3J5X3Nw YWNlX2Rlc2NfdCBkZXNjOworCisgIG1lbXNldCAoJmRlc2MsIDAsIHNpemVvZiAoZGVzYykpOwor ICBkZXNjLnN0eXBlID0gWkVUX1NUUlVDVFVSRV9UWVBFX0RFQlVHX01FTU9SWV9TUEFDRV9ERVND OworICBkZXNjLnBOZXh0ID0gbnVsbHB0cjsKKyAgZGVzYy50eXBlID0gKHpldF9kZWJ1Z19tZW1v cnlfc3BhY2VfdHlwZV90KSBhZGRyX3NwYWNlOworICBkZXNjLmFkZHJlc3MgPSAodWludDY0X3Qp IG1lbWFkZHI7CisKKyAgc3RkOjpwYWlyPHplX2RldmljZV90aHJlYWRfdCwgemVfZGV2aWNlX2lu Zm8gKj4gY29udGV4dAorICAgID0gemVfbWVtb3J5X2FjY2Vzc19jb250ZXh0ICh0cCwgYWRkcl9z cGFjZSk7CisgIHplX2RldmljZV90aHJlYWRfdCB0aHJlYWQgPSBjb250ZXh0LmZpcnN0OworICB6 ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gY29udGV4dC5zZWNvbmQ7CisgIGdkYl9hc3NlcnQgKGRl dmljZSAhPSBudWxscHRyKTsKKworICBkcHJpbnRmICgid3JpdGluZyAlZCBieXRlcyBvZiBtZW1v cnkgdG8gJXMgd2l0aCAlcyIsCisJICAgbGVuLCBjb3JlX2FkZHJfdG9fc3RyaW5nX256IChtZW1h ZGRyKSwKKwkgICB6ZV90aHJlYWRfaWRfc3RyICh0aHJlYWQpLmNfc3RyICgpKTsKKworICB6ZV9y ZXN1bHRfdCBzdGF0dXMgPSB6ZXREZWJ1Z1dyaXRlTWVtb3J5IChkZXZpY2UtPnNlc3Npb24sIHRo cmVhZCwgJmRlc2MsCisJCQkJCSAgICBsZW4sIG15YWRkcik7CisgIHN3aXRjaCAoc3RhdHVzKQor ICAgIHsKKyAgICBjYXNlIFpFX1JFU1VMVF9TVUNDRVNTOgorICAgICAgcmV0dXJuIDA7CisKKyAg ICBkZWZhdWx0OgorICAgICAgZHByaW50ZiAoImVycm9yIHdyaXRpbmcgJWQgYnl0ZXMgb2YgbWVt b3J5IHRvICVzIHdpdGggJXM6ICV4IiwKKwkgICAgICAgbGVuLCBjb3JlX2FkZHJfdG9fc3RyaW5n X256IChtZW1hZGRyKSwKKwkgICAgICAgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAo KSwgc3RhdHVzKTsKKworICAgICAgcmV0dXJuIEVJTzsKKyAgICB9Cit9CisKK2ludAoremVfdGFy Z2V0Ojp3cml0ZV9tZW1vcnkgKENPUkVfQUREUiBtZW1hZGRyLCBjb25zdCB1bnNpZ25lZCBjaGFy ICpteWFkZHIsCisJCQkgaW50IGxlbikKK3sKKyAgcmV0dXJuIHdyaXRlX21lbW9yeSAoY3VycmVu dF90aHJlYWQsIG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKworYm9vbAoremVfdGFyZ2V0Ojp0 aHJlYWRfc3RvcHBlZCAoc3RydWN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgY29uc3QgemVfdGhy ZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgZ2RiX2Fzc2VydCAoemV0cCAhPSBu dWxscHRyKTsKKworICByZXR1cm4gKHpldHAtPmV4ZWNfc3RhdGUgPT0gWkVfVEhSRUFEX1NUQVRF X1NUT1BQRUQpOworfQorCit2b2lkCit6ZV90YXJnZXQ6OnJlcXVlc3RfaW50ZXJydXB0ICgpCit7 CisgIGlmIChjdXJyZW50X3Byb2Nlc3MgKCkgPT0gbnVsbHB0cikKKyAgICBlcnJvciAoXygibm8g Y3VycmVudCBwcm9jZXNzLiIpKTsKKworICBwcm9jZXNzX2luZm8gKnByb2Nlc3MgPSBjdXJyZW50 X3Byb2Nlc3MgKCk7CisgIGdkYl9hc3NlcnQgKHByb2Nlc3MgIT0gbnVsbHB0cik7CisKKyAgcHJv Y2Vzc19pbmZvX3ByaXZhdGUgKnByaXYgPSBwcm9jZXNzLT5wcml2OworICBnZGJfYXNzZXJ0IChw cml2ICE9IG51bGxwdHIpOworCisgIC8qIFRoZSBvbmx5IHJlYXNvbiB3aHkgd2Ugd291bGQgbm90 IGhhdmUgYSBkZXZpY2UgaXMgaWYgd2UgZ290IGRldGFjaGVkLgorCisgICAgIFRoZXJlIGlzIG5v dGhpbmcgdG8gaW50ZXJydXB0IGluIHRoYXQgY2FzZS4gICovCisgIHplX2RldmljZV9pbmZvICpk ZXZpY2UgPSBwcml2LT5kZXZpY2U7CisgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikKKyAgICByZXR1 cm47CisKKyAgLyogSW50ZXJydXB0IGlzIG5vdCBhIHJlc3VtZSByZXF1ZXN0LiAgKi8KKworICB6 ZV9kZXZpY2VfdGhyZWFkX3QgYWxsID0gemVfdGhyZWFkX2lkX2FsbCAoKTsKKyAgemVfaW50ZXJy dXB0ICgqZGV2aWNlLCBhbGwpOworfQorCit2b2lkCit6ZV90YXJnZXQ6OnBhdXNlX2FsbCAoYm9v bCBmcmVlemUpCit7CisgIGRwcmludGYgKCJmcmVlemU6ICVkIiwgZnJlZXplKTsKKworICBpZiAo ZnJlZXplKQorICAgIHsKKyAgICAgIGlmIChmcm96ZW4gPT0gVUlOVDMyX01BWCkKKwlpbnRlcm5h bF9lcnJvciAoXygiZnJlZXplIGNvdW50IG92ZXJmbG93IikpOworICAgICAgZnJvemVuICs9IDE7 CisgICAgfQorCisgIC8qIE5vdGhpbmcgdG8gc3RvcCBpZiB3ZSB3ZXJlIGZyb3plbiBhbHJlYWR5 LiAgKi8KKyAgaWYgKGZyb3plbiA+IDEpCisgICAgcmV0dXJuOworCisgIC8qIEludGVycnVwdGlu ZyBhbGwgdGhyZWFkcyBvbiBkZXZpY2VzIHRoYXQgaGF2ZSBhbnkgcmVzdW1lZCB0aHJlYWRzLgor CisgICAgIFRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBzdG9wcGVkIHdpbGwgYmUgaWdub3JlZCBi eSB0aGUgaW50ZXJydXB0LiAgKi8KKyAgemVfZGV2aWNlX3RocmVhZF90IGFsbCA9IHplX3RocmVh ZF9pZF9hbGwgKCk7CisgIGZvciAoemVfZGV2aWNlX2luZm8gKmRldmljZSA6IGRldmljZXMpCisg ICAgeworICAgICAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgICAgICAvKiBJ Z25vcmUgZGV2aWNlcyB3ZSdyZSBub3QgbW9kZWxsaW5nIGFzIHByb2Nlc3Nlcy4gICovCisgICAg ICBpZiAoZGV2aWNlLT5wcm9jZXNzID09IG51bGxwdHIpCisJY29udGludWU7CisKKyAgICAgIGlm ICgoZGV2aWNlLT5ucmVzdW1lZCAhPSAwKSAmJiAoZGV2aWNlLT5uaW50ZXJydXB0cyA9PSAwKSkK Kwl6ZV9pbnRlcnJ1cHQgKCpkZXZpY2UsIGFsbCk7CisgICAgfQorCisgIC8qIEZldGNoIGV2ZW50 cyB1bnRpbCBubyBkZXZpY2UgaGFzIGFueSByZXN1bWVkIHRocmVhZHMgbGVmdC4gICovCisgIGZl dGNoX2V2ZW50c19hbGxfZGV2aWNlc19ub19yZXN1bWVkICgpOworCisgIC8qIE1hcmsgdGhyZWFk cyB3ZSBpbnRlcnJ1cHRlZCBwYXVzZWQgc28gdW5wYXVzZV9hbGwgY2FuIGZpbmQgdGhlbi4gICov CisgIGZvcl9lYWNoX3RocmVhZCAoW10gKHRocmVhZF9pbmZvICp0cCkKKyAgICB7CisgICAgICAv KiBBIHRocmVhZCB3aXRob3V0IHdhaXRzdGF0dXMgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQg YnkgYQorCSBwcmV2aW91cyBwYXVzZV9hbGwgb3IgaXQgaGFzIHJlcG9ydGVkIGl0cyBldmVudCB0 byBoaWdoZXIgbGF5ZXJzCisJIHZpYSB3YWl0LgorCisJIERvbid0IG1hcmsgaXQgcGF1c2VkLiAg SXQgZWl0aGVyIGFscmVhZHkgaXMsIGlmIGl0IHdhcyBzdG9wcGVkIGJ5CisJIGEgcHJldmlvdXMg cGF1c2VfYWxsLCBvciBoaWdoZXIgbGF5ZXJzIGFzc3VtZSBpdCB0byBiZSBzdG9wcGVkIHNvCisJ IHdlIGRvbid0IHdhbnQgaXQgc28gYmUgcmVzdW1lZCBieSB1bnBhdXNlX2FsbC4gICovCisgICAg ICBpZiAoIXplX2hhc193YWl0c3RhdHVzICh0cCkpCisJcmV0dXJuOworCisgICAgICAvKiBEbyBu b3QgbWFyayB0aHJlYWRzIHRoYXQgd2FpdCB3b3VsZCBwaWNrLCBldmVuIGlmIHRoZWlyIGV2ZW50 IHdhcworCSBvbmx5IGp1c3QgZmV0Y2hlZC4gICovCisgICAgICBpZiAoemVfaGFzX3ByaW9yaXR5 X3dhaXRzdGF0dXMgKHRwKSkKKwlyZXR1cm47CisKKyAgICAgIHplX3RocmVhZF9pbmZvICp6ZXRw ID0gemVfdGhyZWFkICh0cCk7CisgICAgICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxwdHIpOwor CisgICAgICAvKiBDbGVhciB0aGUgbm9uLXByaW9yaXR5IHdhaXRzdGF0dXMgc28gd2FpdCBkb2Vz bid0IHBpY2sgdGhlIHRocmVhZAorCSB0byByZXBvcnQgYW4gKHVuYXZhaWxhYmxlKSBldmVudCB3 ZSBqdXN0IGZldGNoZWQuICAqLworICAgICAgemV0cC0+d2FpdHN0YXR1cy5zZXRfaWdub3JlICgp OworCisgICAgICAvKiBJZ25vcmUgdGhyZWFkcyB0aGF0IGFyZW4ndCBzdG9wcGVkLCBtb3N0IGxp a2VseSBiZWNhdXNlIHRoZXkgYXJlCisJIHVuYXZhaWxhYmxlLgorCisJIEV2ZW4gdGhvdWdoIGFu IHVuYXZhaWxhYmxlIHRocmVhZCBtYXkgaGF2ZSByZXNwb25kZWQgdG8gb3VyCisJIGludGVycnVw dCwgd2UgZG8gbm90IG1hcmsgaXQgcGF1c2VkIGJlY2F1c2Ugd2UgbmVlZCB0byB0cmVhdAorCSB1 bmF2YWlsYWJsZSBhbmQgc3RvcHBlZCB0aHJlYWRzIGRpZmZlcmVudGx5IGluIHVucGF1c2VfYWxs LiAgKi8KKyAgICAgIGlmICh6ZV90aHJlYWRfc3RvcHBlZCAodHApKQorCXpldHAtPmV4ZWNfc3Rh dGUgPSBaRV9USFJFQURfU1RBVEVfUEFVU0VEOworICAgIH0pOworfQorCit2b2lkCit6ZV90YXJn ZXQ6OnVucGF1c2VfYWxsIChib29sIHVuZnJlZXplKQoreworICBkcHJpbnRmICgiZnJlZXplOiAl ZCIsIHVuZnJlZXplKTsKKworICBpZiAodW5mcmVlemUpCisgICAgeworICAgICAgaWYgKGZyb3pl biA9PSAwKQorCWludGVybmFsX2Vycm9yIChfKCJmcmVlemUgY291bnQgdW5kZXJmbG93IikpOwor ICAgICAgZnJvemVuIC09IDE7CisgICAgfQorCisgIC8qIE5vdGhpbmcgdG8gcmVzdW1lIGlmIHdl J3JlIHN0aWxsIGZyb3plbi4gICovCisgIGlmIChmcm96ZW4gPiAxKQorICAgIHJldHVybjsKKwor ICAvKiBSZXN1bWUgdGhyZWFkcyB0aGF0IHdlcmUgbWFya2VkIGJ5IHBhdXNlX2FsbCBhcyB3ZWxs IGFzIHVuYXZhaWxhYmxlCisgICAgIHRocmVhZHMgdGhhdCB3ZXJlIG5vdCByZXF1ZXN0ZWQgdG8g c3RvcC4KKworICAgICBQYXVzZV9hbGwgbGVhdmVzIHRoZSBsYXR0ZXIgbWFya2VkIHVuYXZhaWxh YmxlLiAgV2UgZG9uJ3QgcmVhbGx5CisgICAgIHJlc3VtZSB0aGVtIGFzIHRoZXkgd2VyZSBub3Qg YWN0dWFsbHkgc3RvcHBlZCBvbiB0aGUgdGFyZ2V0LCBidXQgd2UKKyAgICAgbmVlZCB0byB1cGRh dGUgdGhlIHRocmVhZCBzdGF0ZSBhbmQgc29tZSBzdGF0aXN0aWNzLiAgKi8KKworICAvKiBDaGVj ayB3aGljaCBkZXZpY2VzIGFyZSBzYWZlIHRvIGJlIHJlc3VtZWQgYW5kIHdoaWNoIG5lZWQgdG8g YmUKKyAgICAgY2hlY2tlZCBmb3IgaW5kaXZpZHVhbCB0aHJlYWRzIHRvIGJlIHJlc3VtZWQuCisK KyAgICAgSW4gYWxsLXN0b3AgbW9kZSwgZmluZGluZyBhIHNpbmdsZSB0aHJlYWQgd291bGQgYWxy ZWFkeSBibG9jayB0aGUKKyAgICAgdW5wYXVzZS4gIFdlIGRvIG5vdCBleHBlY3QgdGhpcyB0byBi ZSBwZXJmb3JtYW5jZSBjcml0aWNhbCAob3IgdXNlZAorICAgICBhdCBhbGwpLCBob3dldmVyLCBz byBsZXQncyB1bmlmeSBhbGwtc3RvcCBhbmQgbm9uLXN0b3AgYXMgbXVjaCBhcworICAgICBwb3Nz aWJsZS4gICovCisgIHN0ZDo6c2V0PHplX2RldmljZV9pbmZvICo+IGRldmljZXNfdG9fY2hlY2s7 CisgIHN0ZDo6c2V0PHplX2RldmljZV9pbmZvICo+IGRldmljZXNfdG9fcmVzdW1lIHtkZXZpY2Vz LmJlZ2luICgpLAorICAgIGRldmljZXMuZW5kICgpfTsKKworICBmb3JfZWFjaF90aHJlYWQgKFsm XSAodGhyZWFkX2luZm8gKnRwKQorICAgIHsKKyAgICAgIHplX3RocmVhZF9leGVjX3N0YXRlX3Qg c3RhdGUgPSB6ZV9leGVjX3N0YXRlICh0cCk7CisgICAgICBzd2l0Y2ggKHN0YXRlKQorCXsKKwlj YXNlIFpFX1RIUkVBRF9TVEFURV9QQVVTRUQ6CisJICByZXR1cm47CisKKwljYXNlIFpFX1RIUkVB RF9TVEFURV9VTkFWQUlMQUJMRToKKwkgIHsKKwkgICAgLyogRGlzdGluZ3Vpc2ggdW5hdmFpbGFi bGUgdGhyZWFkcyB0aGF0IHdlIHRyaWVkIHRvIGludGVycnVwdAorCSAgICAgICBpbiBwYXVzZV9h bGwgZnJvbSB0aG9zZSB0aGF0IEdEQiB0cmllZCB0byBpbnRlcnJ1cHQgd2l0aCBhCisJICAgICAg IHN0b3AgcmVzdW1lIHJlcXVlc3QuICAqLworCSAgICB6ZV90aHJlYWRfcmVzdW1lX3N0YXRlX3Qg cmVzdW1lX3N0YXRlID0gemVfcmVzdW1lX3N0YXRlICh0cCk7CisJICAgIGlmIChyZXN1bWVfc3Rh dGUgIT0gWkVfVEhSRUFEX1JFU1VNRV9TVE9QKQorCSAgICAgIHJldHVybjsKKwkgIH0KKworCSAg W1tmYWxsdGhyb3VnaF1dOworCWNhc2UgWkVfVEhSRUFEX1NUQVRFX1NUT1BQRUQ6CisJY2FzZSBa RV9USFJFQURfU1RBVEVfSEVMRDoKKwkgIHsKKwkgICAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9 IHplX3RocmVhZF9kZXZpY2UgKHRwKTsKKwkgICAgaWYgKGRldmljZSA9PSBudWxscHRyKQorCSAg ICAgIHJldHVybjsKKworCSAgICBkZXZpY2VzX3RvX2NoZWNrLmluc2VydCAoZGV2aWNlKTsKKwkg ICAgZGV2aWNlc190b19yZXN1bWUuZXJhc2UgKGRldmljZSk7CisJICB9CisJICByZXR1cm47CisK KwljYXNlIFpFX1RIUkVBRF9TVEFURV9SVU5OSU5HOgorCSAgd2FybmluZyAoXygidGhyZWFkICVk LiVsZCBydW5uaW5nIGluIHVucGF1c2UiKSwgdHAtPmlkLnBpZCAoKSwKKwkJICAgdHAtPmlkLmx3 cCAoKSk7CisJICByZXR1cm47CisKKwljYXNlIFpFX1RIUkVBRF9TVEFURV9VTktOT1dOOgorCSAg d2FybmluZyAoXygidGhyZWFkICVkLiVsZCBoYXMgdW5rbm93biBleGVjdXRpb24gIgorCQkgICAg ICJzdGF0ZSIpLCB0cC0+aWQucGlkICgpLCB0cC0+aWQubHdwICgpKTsKKwkgIHJldHVybjsKKwl9 CisKKyAgICAgIGludGVybmFsX2Vycm9yIChfKCJiYWQgZXhlY3V0aW9uIHN0YXRlOiAlZC4iKSwg c3RhdGUpOworICAgIH0pOworCisgIC8qIEluIGFsbC1zdG9wIG1vZGUsIGFueSBkZXZpY2UgdGhh dCBjYW5ub3QgYmUgcmVzdW1lZCBhYm9ydHMgdW5wYXVzZS4gICovCisgIGlmICghbm9uX3N0b3Ag JiYgIWRldmljZXNfdG9fY2hlY2suZW1wdHkgKCkpCisgICAgcmV0dXJuOworCisgIC8qIFJlc3Vt ZSBpbmRpdmlkdWFsIHRocmVhZHMuCisKKyAgICAgSW4gYWxsLXN0b3AgbW9kZSwgdGhpcyB3aWxs IGJlIGVtcHR5LiAgKi8KKyAgZm9yICh6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlIDogZGV2aWNlc190 b19jaGVjaykKKyAgICB7CisgICAgICBnZGJfYXNzZXJ0IChkZXZpY2UgIT0gbnVsbHB0cik7CisK KyAgICAgIGRldmljZS0+cHJvY2Vzcy0+Zm9yX2VhY2hfdGhyZWFkIChbdGhpc10gKHRocmVhZF9p bmZvICp0cCkKKwl7CisJICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOwor CSAgZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworCSAgemVfdGhyZWFkX2V4ZWNfc3Rh dGVfdCBzdGF0ZSA9IHpldHAtPmV4ZWNfc3RhdGU7CisJICBzd2l0Y2ggKHN0YXRlKQorCSAgICB7 CisJICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1NUT1BQRUQ6CisJICAgIGNhc2UgWkVfVEhSRUFE X1NUQVRFX0hFTEQ6CisJICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1JVTk5JTkc6CisJICAgIGNh c2UgWkVfVEhSRUFEX1NUQVRFX1VOS05PV046CisJICAgICAgLyogV2UgYWxyZWFkeSBkaWFnbm9z ZWQgdW5leHBlY3RlZCBzdGF0ZXMgYWJvdmUuICAqLworCSAgICAgIHJldHVybjsKKworCSAgICBj YXNlIFpFX1RIUkVBRF9TVEFURV9VTkFWQUlMQUJMRToKKwkgICAgICB7CisJCS8qIERvbid0IHRv dWNoIHRocmVhZHMgdGhhdCBHREIgd2FudHMgc3RvcHBlZC4gICovCisJCXplX3RocmVhZF9yZXN1 bWVfc3RhdGVfdCByZXN1bWVfc3RhdGUgPSB6ZV9yZXN1bWVfc3RhdGUgKHRwKTsKKwkJaWYgKHJl c3VtZV9zdGF0ZSA9PSBaRV9USFJFQURfUkVTVU1FX1NUT1ApCisJCSAgcmV0dXJuOworCisJCS8q IFdlIGRvbid0IHBsYW4gdG8gcmVzdW1lIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByZXBhcmUgVFAK KwkJICAgZm9yIG5yZXN1bWVkIHRyYWNraW5nIGFuZCB0aHJlYWQgc3RhdGUgbWFuYWdlbWVudC4g ICovCisJCWJvb2wgc2hvdWxkX3Jlc3VtZSA9IHplX3ByZXBhcmVfZm9yX3Jlc3VtaW5nICh0cCk7 CisJCWdkYl9hc3NlcnQgKCFzaG91bGRfcmVzdW1lKTsKKwkgICAgICB9CisJICAgICAgcmV0dXJu OworCisJICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1BBVVNFRDoKKwkgICAgICByZXN1bWVfc2lu Z2xlX3RocmVhZCAodHApOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0pOworICAgIH0KKwor ICAvKiBSZXN1bWUgZW50aXJlIGRldmljZXMgYXQgb25jZS4gICovCisgIGZvciAoemVfZGV2aWNl X2luZm8gKmRldmljZSA6IGRldmljZXNfdG9fcmVzdW1lKQorICAgIHsKKyAgICAgIGdkYl9hc3Nl cnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICAgICAgLyogU2tpcCBkZXZpY2VzIHdlJ3JlIG5v dCBtb2RlbGluZyBhcyBwcm9jZXNzZXMuICAqLworICAgICAgaWYgKGRldmljZS0+cHJvY2VzcyA9 PSBudWxscHRyKQorCWNvbnRpbnVlOworCisgICAgICByZXN1bWUgKCpkZXZpY2UpOworICAgIH0K K30KKwordm9pZAoremVfdGFyZ2V0OjphY2tfbGlicmFyeSAocHJvY2Vzc19pbmZvICpwcm9jZXNz LCBjb25zdCBjaGFyICpuYW1lKQoreworICAvKiBBbGwgbGlicmFyaWVzIGFyZSBpbi1tZW1vcnku ICAqLworICB3YXJuaW5nIChfKCJ1bmV4cGVjdGVkIGFja25vd2xlZGdlbWVudCByZXF1ZXN0ZWQg Zm9yIGxpYnJhcnkgJXMuIiksIG5hbWUpOworfQorCit2b2lkCit6ZV90YXJnZXQ6OmFja19pbl9t ZW1vcnlfbGlicmFyeSAocHJvY2Vzc19pbmZvICpwcm9jZXNzLAorCQkJCSAgQ09SRV9BRERSIGJl Z2luLCBDT1JFX0FERFIgZW5kKQoreworICBnZGJfYXNzZXJ0IChwcm9jZXNzICE9IG51bGxwdHIp OworCisgIHByb2Nlc3NfaW5mb19wcml2YXRlICp6ZXByb2MgPSBwcm9jZXNzLT5wcml2OworICBn ZGJfYXNzZXJ0ICh6ZXByb2MgIT0gbnVsbHB0cik7CisKKyAgLyogVGhlIG9ubHkgcmVhc29uIHdo eSB3ZSB3b3VsZCBub3QgaGF2ZSBhIGRldmljZSBpcyBpZiB3ZSBnb3QgZGV0YWNoZWQuCisKKyAg ICAgVGhlcmUgaXMgbm90aGluZyB0byBhY2tub3dsZWRnZSBpbiB0aGF0IGNhc2UuICAqLworICB6 ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gemVwcm9jLT5kZXZpY2U7CisgIGlmIChkZXZpY2UgPT0g bnVsbHB0cikKKyAgICB7CisgICAgICBkcHJpbnRmICgiWyVzOyVzKSBkZXZpY2Ugbm90IGZvdW5k LiIsIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKGJlZ2luKSwKKwkgICAgICAgY29yZV9hZGRyX3Rv X3N0cmluZ19ueiAoZW5kKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGV2ZW50c190ICZl dmVudHMgPSBkZXZpY2UtPmFja19wZW5kaW5nOworICBldmVudHNfdDo6aXRlcmF0b3IgaXQKKyAg ICA9IHN0ZDo6ZmluZF9pZiAoZXZlbnRzLmJlZ2luICgpLCBldmVudHMuZW5kICgpLAorCQkgICAg W2JlZ2luLCBlbmRdIChjb25zdCB6ZXRfZGVidWdfZXZlbnRfdCAmZXYpCisJeworCSAgcmV0dXJu ICgoZXYudHlwZSA9PSBaRVRfREVCVUdfRVZFTlRfVFlQRV9NT0RVTEVfTE9BRCkKKwkJICAmJiAo ZXYuaW5mby5tb2R1bGUubW9kdWxlQmVnaW4gPT0gYmVnaW4pCisJCSAgJiYgKGV2LmluZm8ubW9k dWxlLm1vZHVsZUVuZCA9PSBlbmQpKTsKKwl9KTsKKworICBpZiAoaXQgPT0gZXZlbnRzLmVuZCAo KSkKKyAgICB7CisgICAgICBkcHJpbnRmICgiWyVzOyVzKSBub3QgZm91bmQuIiwgY29yZV9hZGRy X3RvX3N0cmluZ19ueiAoYmVnaW4pLAorCSAgICAgICBjb3JlX2FkZHJfdG9fc3RyaW5nX256IChl bmQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgemVfYWNrX2V2ZW50ICgqZGV2aWNlLCAq aXQpOworICBldmVudHMuZXJhc2UgKGl0KTsKKworICBkcHJpbnRmICgiWyVzOyVzKSBhY2tub3ds ZWRnZWQuIiwgY29yZV9hZGRyX3RvX3N0cmluZ19ueiAoYmVnaW4pLAorCSAgIGNvcmVfYWRkcl90 b19zdHJpbmdfbnogKGVuZCkpOworfQpkaWZmIC0tZ2l0IGEvZ2Ric2VydmVyL3plLWxvdy5oIGIv Z2Ric2VydmVyL3plLWxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJjNDhjNDlhOTE0Zjg4NGU0ODA4ZjdkYTZi OWU3ODg0MDA3OTI1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGJzZXJ2ZXIvemUtbG93LmgKQEAg LTAsMCArMSw0OTIgQEAKKy8qIFRhcmdldCBpbnRlcmZhY2UgZm9yIExldmVsLVplcm8gYmFzZWQg dGFyZ2V0cyBmb3IgZ2Ric2VydmVyLgorICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vbmVhcGkt c3JjL2xldmVsLXplcm8uZ2l0LgorCisgICBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNCBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgor CisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisg ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIEdEQlNFUlZFUl9MRVZF TF9aRVJPX0xPV19ICisjZGVmaW5lIEdEQlNFUlZFUl9MRVZFTF9aRVJPX0xPV19ICisKKyNpbmNs dWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ0ZGVzYy5oIgorCisjaW5jbHVkZSA8bGV2ZWxfemVy by96ZXRfYXBpLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNs dWRlIDxsaXN0PgorCisKKy8qIEluZm9ybWF0aW9uIGFib3V0IHJlZ2lzdGVyIHNldHMgcmVwb3J0 ZWQgaW4gdGFyZ2V0IGRlc2NyaXB0aW9ucy4KKworICAgVGhlIG1haW4gdXNlIG9mIHRoaXMgaXMg dG8gZmluZCB0aGUgaW5mb3JtYXRpb24gcmVsZXZhbnQgZm9yIGZldGNoaW5nCisgICBhbmQgc3Rv cmluZyByZWdpc3RlcnMgdmlhIExldmVsLVplcm8gYmFzZWQgb24gcmVnaXN0ZXIgbnVtYmVycy4g ICovCitzdHJ1Y3QgemVfcmVnc2V0X2luZm8KK3sKKyAgLyogVGhlIGRldmljZS1zcGVjaWZpYyBM ZXZlbC1aZXJvIHJlZ2lzdGVyIHNldCB0eXBlLiAgKi8KKyAgdWludDMyX3QgdHlwZTsKKworICAv KiBUaGUgcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyBmb3IgcmVhZGluZy93cml0aW5nLiAgKi8KKyAg dWludDMyX3Qgc2l6ZTsKKworICAvKiBUaGUgYmVnaW4gKGluY2x1c2l2ZSkgYW5kIGVuZCAoZXhj bHVzaXZlKSByZWdpc3RlciBudW1iZXJzIGZvciB0aGlzCisgICAgIHJlZ3NldC4KKworICAgICBU aGlzIGlzIHVzZWQgdG8gbWFwIHJlZ2lzdGVyIG51bWJlcnMgdG8gcmVnc2V0IHR5cGVzLiAgKi8K KyAgbG9uZyBiZWdpbiwgZW5kOworCisgIC8qIFdoZXRoZXIgdGhlIHJlZ3NldCBpcyB3cml0YWJs ZS4gIFdlIGFzc3VtZSBhbGwgYXJlIHJlYWRhYmxlLiAgKi8KKyAgYm9vbCBpc193cml0ZWFibGU7 Cit9OworCisvKiBBIHZlY3RvciBvZiByZWdzZXQgaW5mb3MuICAqLwordHlwZWRlZiBzdGQ6OnZl Y3Rvcjx6ZV9yZWdzZXRfaW5mbz4gemVfcmVnc2V0X2luZm9fdDsKKworLyogQSB2ZWN0b3Igb2Yg ZXhwZWRpdGUgcmVnaXN0ZXIgbmFtZXMuCisKKyAgIFRoZSBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8g YmUgc3RyaW5nIGxpdGVyYWxzLiAgVGhlIHZlY3RvciBtdXN0IGJlCisgICB0ZXJtaW5hdGVkIHdp dGggYSBzaW5nbGUgbnVsbHB0ciBlbnRyeS4gICovCit0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0 IGNoYXIgKj4gZXhwZWRpdGVfdDsKKworLyogQSBsaXN0IG9mIGRlYnVnIGV2ZW50cy4gICovCisK K3R5cGVkZWYgc3RkOjpsaXN0PHpldF9kZWJ1Z19ldmVudF90PiBldmVudHNfdDsKKworLyogSW5m b3JtYXRpb24gYWJvdXQgZGV2aWNlcyB3ZSdyZSBhdHRhY2hlZCB0by4KKworICAgVGhpcyBpcyBw cmV0dHkgc2ltaWxhciB0byBwcm9jZXNzX2luZm8uICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHdl IG9ubHkKKyAgIHdhbnQgdG8gdGVsbCBHREIgYWJvdXQgZGV2aWNlcyB0aGF0IHRoZSBob3N0IGFw cGxpY2F0aW9uIGFjdHVhbGx5IHVzZXMuCisgICBUbyBrbm93IHRoYXQsIGhvd2V2ZXIsIHdlIG5l ZWQgdG8gYXR0YWNoIHRvIGFsbCBhdmFpbGFibGUgZGV2aWNlcy4gICovCisKK3N0cnVjdCB6ZV9k ZXZpY2VfaW5mbworeworICAvKiBUaGUgZGVidWcgc2Vzc2lvbiBjb25maWd1cmF0aW9uLiAgKi8K KyAgemV0X2RlYnVnX2NvbmZpZ190IGNvbmZpZyA9IHt9OworCisgIC8qIFRoZSBkZXZpY2UgaGFu ZGxlLiAgVGhpcyBtdXN0IG5vdCBiZSBudWxscHRyLiAgKi8KKyAgemVfZGV2aWNlX2hhbmRsZV90 IGhhbmRsZSA9IG51bGxwdHI7CisKKyAgLyogVGhlIGRldmljZSdzIHByb3BlcnRpZXMuICAqLwor ICB6ZV9kZXZpY2VfcHJvcGVydGllc190IHByb3BlcnRpZXMgPSB7fTsKKworICAvKiBUaGUgZGVi dWcgc2Vzc2lvbiBoYW5kbGUuCisKKyAgICAgVGhpcyBpcyBudWxscHRyIGlmIHdlIGFyZSBub3Qg Y3VycmVudGx5IGF0dGFjaGVkLiAgKi8KKyAgemV0X2RlYnVnX3Nlc3Npb25faGFuZGxlX3Qgc2Vz c2lvbiA9IG51bGxwdHI7CisKKyAgLyogVGhlIHN0YXRlIGZvciBkZWJ1ZyBhdHRhY2ggYXR0ZW1w dC4KKworICAgICBUaGlzIGlzIGNvbXBsZW1lbnRhcnkgaW5mb3JtYXRpb24gZm9yIGRlYnVnIHNl c3Npb24gaGFuZGxlLiAgVGhlCisgICAgIGRlYnVnIHNlc3Npb24gaGFuZGxlIGlzIG51bGwsIHdo ZW4gZGVidWcgYXR0YWNoIGF0dGVtcHQgZmFpbHMuCisgICAgIEluIHRoaXMgY2FzZSwgZGVidWcg YXR0YWNoIHN0YXRlIGNvbnRhaW5zIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAgdGhlIGxhc3Qg ZXJyb3IuICAqLworICB6ZV9yZXN1bHRfdCBkZWJ1Z19hdHRhY2hfc3RhdGU7CisKKyAgLyogVGhl IHRhcmdldCBkZXNjcmlwdGlvbiBmb3IgdGhpcyBkZXZpY2UuICAqLworICB0YXJnZXRfZGVzY191 cCB0ZGVzYzsKKworICAvKiBUaGUgcmVnaXN0ZXIgc2V0cyByZXBvcnRlZCBpbiB0aGUgZGV2aWNl J3MgdGFyZ2V0IGRlc2NyaXB0aW9uLiAgKi8KKyAgemVfcmVnc2V0X2luZm9fdCByZWdzZXRzOwor CisgIC8qIFRoZSBleHBlZGl0ZSByZWdpc3RlcnMgdXNlZCBmb3IgdGhpcyBkZXZpY2UncyB0YXJn ZXQgZGVzY3JpcHRpb24uICAqLworICBleHBlZGl0ZV90IGV4cGVkaXRlOworCisgIC8qIFRoZSBk ZXZpY2UgZW51bWVyYXRpb24gb3JkaW5hbCBudW1iZXIuICAqLworICB1bnNpZ25lZCBsb25nIG9y ZGluYWwgPSAwOworCisgIC8qIFRoZSBwcm9jZXNzIGZvciB0aGlzIGRldmljZS4KKworICAgICBX ZSBtb2RlbCBkZXZpY2VzIHdlJ3JlIGF0dGFjaGVkIHRvIGFzIGluZmVyaW9yIHByb2Nlc3MuICBJ biBHREIsIHdlCisgICAgIGhpZGUgaW5mZXJpb3JzIHJlcHJlc2VudGluZyBkZXZpY2VzIHRoYXQg YXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQKKyAgICAgb25seSBzaG93IGluZmVyaW9ycyBmb3Ig ZGV2aWNlcyB0aGF0IGFyZSBpbiB1c2UuCisKKyAgICAgSWYgd2UgYXJlIG5vdCBhdHRhY2hlZCB0 byB0aGlzIGRldmljZSwgUFJPQ0VTUyB3aWxsIGJlIG51bGxwdHIuICAqLworICBwcm9jZXNzX2lu Zm8gKnByb2Nlc3MgPSBudWxscHRyOworCisgIC8qIEEgbGlzdCBvZiB0by1iZS1hY2tub3dsZWRn ZWQgZXZlbnRzLiAgKi8KKyAgZXZlbnRzX3QgYWNrX3BlbmRpbmc7CisKKyAgLyogVG90YWwgbnVt YmVyIG9mIHRocmVhZHMgb24gdGhpcyBkZXZpY2UuICAqLworICB1bnNpZ25lZCBsb25nIG50aHJl YWRzID0gMDsKKworICAvKiBOdW1iZXIgb2YgcmVzdW1lZCB0aHJlYWRzLiAgVGhlIHZhbHVlIGlz IHVzZWZ1bCBmb3IgZGVjaWRpbmcgaWYKKyAgICAgd2UgY2FuIG9taXQgc2VuZGluZyBhbiBhY3R1 YWwgaW50ZXJydXB0IHJlcXVlc3Qgd2hlbiB3ZSB3YW50IGFsbAorICAgICB0aHJlYWRzIHRvIGJl IHN0b3BwZWQgaW4gYWxsLXN0b3AgbW9kZS4KKworICAgICBUaGUgdmFsdWUgY2FuIHVuZGVyZmxv dyBiZWNhdXNlIG9mIHVuYXZhaWxhYmxlIHRocmVhZHMgYmVjb21pbmcKKyAgICAgYXZhaWxhYmxl IGFuZCBnZW5lcmF0aW5nIHN0b3AgZXZlbnRzLiAgVGhlcmVmb3JlIHdlIHBheSBjYXJlIHRvCisg ICAgIHByZXZlbnQgdW5kZXJmbG93aW5nLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBucmVzdW1lZCA9 IDA7CisKKyAgLyogTnVtYmVyIG9mIGludGVycnVwdHMgc2VudCB0byB0aGlzIHRhcmdldC4gICov CisgIHVuc2lnbmVkIGxvbmcgbmludGVycnVwdHMgPSAwOworfTsKKworLyogQSB0aHJlYWQncyBy ZXN1bWUgc3RhdGUuCisKKyAgIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGVudW0gcmVzdW1lX2tp bmQgZXhjZXB0IHRoYXQgd2UgbmVlZCBhbgorICAgYWRkaXRpb25hbCBub25lIGNhc2UgdG8gbW9k ZWwgdGhlIHRocmVhZCBub3QgYmVpbmcgbWVudGlvbmVkIGluIGFueQorICAgcmVzdW1lIHJlcXVl c3QuICAqLworCitlbnVtIHplX3RocmVhZF9yZXN1bWVfc3RhdGVfdAoreworICAvKiBHZGJzZXJ2 ZXIgZGlkIG5vdCBhc2sgYW55dGhpbmcgb2YgdGhpcyB0aHJlYWQuICAqLworICBaRV9USFJFQURf UkVTVU1FX05PTkUsCisKKyAgLyogVGhlIHRocmVhZCBzaGFsbCBzdG9wLiAgKi8KKyAgWkVfVEhS RUFEX1JFU1VNRV9TVE9QLAorCisgIC8qIFRoZSB0aHJlYWQgc2hhbGwgcnVuLiAgKi8KKyAgWkVf VEhSRUFEX1JFU1VNRV9SVU4sCisKKyAgLyogVGhlIHRocmVhZCBzaGFsbCBzdGVwLiAgKi8KKyAg WkVfVEhSRUFEX1JFU1VNRV9TVEVQCit9OworCisvKiBBIHRocmVhZCdzIGV4ZWN1dGlvbiBzdGF0 ZS4gICovCisKK2VudW0gemVfdGhyZWFkX2V4ZWNfc3RhdGVfdAoreworICAvKiBXZSBkbyBub3Qg a25vdyB0aGUgdGhyZWFkIHN0YXRlLiAgVGhpcyBpcyBsaWtlbHkgYW4gZXJyb3IgY29uZGl0aW9u LiAgKi8KKyAgWkVfVEhSRUFEX1NUQVRFX1VOS05PV04sCisKKyAgLyogVGhlIHRocmVhZCBpcyBz dG9wcGVkIGFuZCBpcyBleHBlY3RlZCB0byByZW1haW4gc3RvcHBlZCB1bnRpbCB3ZQorICAgICBy ZXN1bWUgaXQuICAqLworICBaRV9USFJFQURfU1RBVEVfU1RPUFBFRCwKKworICAvKiBUaGUgdGhy ZWFkIGlzIHN0b3BwZWQgYnV0IHdlIGFyZSBob2xkaW5nIGl0cyBzdG9wIGV2ZW50IHVudGlsIHdl CisgICAgIHJlc3VtZSBpdC4gICovCisgIFpFX1RIUkVBRF9TVEFURV9IRUxELAorCisgIC8qIFRo ZSB0aHJlYWQgaXMgc3RvcHBlZCBieSBwYXVzZV9hbGwgKCkuICBJbiB1bnBhdXNlX2FsbCAoKSwg d2UgbmVlZCB0bworICAgICByZXN1bWUganVzdCB0aGUgcGF1c2VkIHRocmVhZHMuCisKKyAgICAg SW4gcGFydGljdWxhciwgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aHJlYWRzIHRoYXQgcmVwb3J0 ZWQgdGhlaXIKKyAgICAgZXZlbnQgdG8gaGlnaGVyIGxheWVycyBpbiBnZGJzZXJ2ZXIgYW5kIGhl bmNlIGhhdmUgdGhlaXIgd2FpdHN0YXR1cworICAgICBjbGVhciAoc2V0IHRvIGlnbm9yZSkgZnJv bSB0aHJlYWRzIHRoYXQgd2VyZSBwYXVzZWQgYW5kIGhhZCB0aGVpcgorICAgICB3YWl0c3RhdHVz IGNsZWFyZWQgYnkgcGF1c2VfYWxsICgpLgorCisgICAgIFVuYXZhaWxhYmxlIHRocmVhZHMgd2ls bCBub3QgYmUgcmVzdW1lZCwgc28gd2Uga2VlcCB0aG9zZSBpbiBzdGF0ZQorICAgICB1bmF2YWls YWJsZSBhbmQgb25seSBjbGVhciB0aGVpciB3YWl0c3RhdHVzIHRvIHByZXZlbnQgdGhlbSBmcm9t CisgICAgIGdldHRpbmcgcmVwb3J0ZWQgYnkgd2FpdCAoKS4gICovCisgIFpFX1RIUkVBRF9TVEFU RV9QQVVTRUQsCisKKyAgLyogVGhlIHRocmVhZCBpcyBydW5uaW5nLiAgV2UgZG8gbm90IGtub3cg d2hldGhlciBpdCBpcyBzdGlsbCBhdmFpbGFibGUKKyAgICAgdG8gdXMgYW5kIHdlJ3JlIGFibGUg dG8gc3RvcCBpdCBvciB3aGV0aGVyIGl0IHdvdWxkIGV2ZW50dWFsbHkgaGl0IGEKKyAgICAgYnJl YWtwb2ludC4KKworICAgICBXaGVuIGEgdGhyZWFkIGNvbXBsZXRlcyBleGVjdXRpbmcgYSBrZXJu ZWwgaXQgYmVjb21lcyBpZGxlIGFuZCBtYXkKKyAgICAgcGljayB1cCBvdGhlciB3b3JrbG9hZHMs IGVpdGhlciBpbiB0aGlzIGNvbnRleHQgb3IgaW4gYW5vdGhlcgorICAgICBwcm9jZXNzJyBjb250 ZXh0LgorCisgICAgIEluIHRoZSBmb3JtZXIgY2FzZSwgaXQgd291bGQgc3RpbGwgYmUgY29uc2lk ZXJlZCBSVU5OSU5HIGZyb20gb3VyCisgICAgIHBvaW50IG9mIHZpZXcsIGV2ZW4gdGhvdWdoIGl0 IHN0YXJ0ZWQgb3ZlciBhZ2FpbiB3aXRoIGEgbmV3IHNldCBvZgorICAgICBhcmd1bWVudHMuICBJ biB0aGUgbGF0dGVyIGNhc2UsIGl0IHdvdWxkIGJlIFVOQVZBSUxBQkxFLiAgKi8KKyAgWkVfVEhS RUFEX1NUQVRFX1JVTk5JTkcsCisKKyAgLyogVGhlIHRocmVhZCBpcyBjdXJyZW50bHkgbm90IGF2 YWlsYWJsZSB0byB1cy4gIEl0IG1heSBiZSBpZGxlIG9yIGl0CisgICAgIG1heSBiZSBleGVjdXRp bmcgd29yayBvbiBiZWhhbGYgb2YgYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKworICAgICBXZSBjYW5u b3QgZGlzdGluZ3Vpc2ggdGhvc2UgY2FzZXMuICBXZSdyZSBub3QgYWJsZSB0byBpbnRlcmFjdCB3 aXRoCisgICAgIHRoYXQgdGhyZWFkLiAgSXQgbWF5IGJlY29tZSBhdmFpbGFibGUgYWdhaW4gYXQg YW55IHRpbWUsIHRob3VnaC4KKworICAgICBGcm9tIEdEQidzIHZpZXcsIGEgdGhyZWFkIG1heSBz d2l0Y2ggYmV0d2VlbiBSVU5OSU5HIGFuZCBVTkFWQUlMQUJMRS4KKyAgICAgV2Ugd2lsbCBvbmx5 IGtub3cgdGhlIGRpZmZlcmVuY2Ugd2hlbiB3ZSB0cnkgdG8gc3RvcCBpdC4gIEl0J3Mgbm90Cisg ICAgIGVudGlyZWx5IGNsZWFyIHdoZXRoZXIgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdv LCBhdCBhbGwuICAqLworICBaRV9USFJFQURfU1RBVEVfVU5BVkFJTEFCTEUKK307CisKKy8qIFRo cmVhZCBwcml2YXRlIGRhdGEgZm9yIExldmVsLVplcm8gdGFyZ2V0cy4gICovCisKK3N0cnVjdCB6 ZV90aHJlYWRfaW5mbworeworICAvKiBUaGUgdGhyZWFkIGlkZW50aWZpZXIuICAqLworICB6ZV9k ZXZpY2VfdGhyZWFkX3QgaWQ7CisKKyAgLyogVGhlIHRocmVhZCdzIHJlc3VtZSBzdGF0ZS4KKwor ICAgICBXaGF0IGRvZXMgZ2Ric2VydmVyIHdhbnQgdGhpcyB0aHJlYWQgdG8gZG8uICAqLworICBl bnVtIHplX3RocmVhZF9yZXN1bWVfc3RhdGVfdCByZXN1bWVfc3RhdGUgPSBaRV9USFJFQURfUkVT VU1FX05PTkU7CisKKyAgLyogVGhlIHN0YXJ0L2VuZCBhZGRyZXNzZXMgZm9yIHJhbmdlLXN0ZXBw aW5nLiAgKi8KKyAgQ09SRV9BRERSIHN0ZXBfcmFuZ2Vfc3RhcnQgPSAwOworICBDT1JFX0FERFIg c3RlcF9yYW5nZV9lbmQgPSAwOworCisgIC8qIFRoZSB0aHJlYWQncyBleGVjdXRpb24gc3RhdGUu CisKKyAgICAgV2hhdCBpcyB0aGlzIHRocmVhZCBhY3R1YWxseSBkb2luZy4gICovCisgIGVudW0g emVfdGhyZWFkX2V4ZWNfc3RhdGVfdCBleGVjX3N0YXRlID0gWkVfVEhSRUFEX1NUQVRFX1VOS05P V047CisKKyAgLyogVGhlIHRocmVhZCdzIHN0b3AgcmVhc29uLgorCisgICAgIFRoaXMgaXMgb25s eSB2YWxpZCBpZiBFWEVDX1NUQVRFID09IFpFX1RIUkVBRF9TVEFURV9TVE9QUEVECisgICAgIG9y IEVYRUNfU1RBVEUgPT0gWkVfVEhSRUFEX1NUQVRFX0hFTEQuICAqLworICB0YXJnZXRfc3RvcF9y ZWFzb24gc3RvcF9yZWFzb24gPSBUQVJHRVRfU1RPUFBFRF9CWV9OT19SRUFTT047CisKKyAgLyog VGhlIHdhaXRzdGF0dXMgZm9yIHRoaXMgdGhyZWFkJ3MgbGFzdCBldmVudC4KKworICAgICBUQVJH RVRfV0FJVEtJTkRfSUdOT1JFIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gbGFzdCBldmVudC4gICov CisgIHRhcmdldF93YWl0c3RhdHVzIHdhaXRzdGF0dXMge307Cit9OworCisvKiBSZXR1cm4gdGhl IFpFIHRocmVhZCBpbmZvIGZvciBUUC4gICovCisKK3N0YXRpYyBpbmxpbmUKK3plX3RocmVhZF9p bmZvICoKK3plX3RocmVhZCAodGhyZWFkX2luZm8gKnRwKQoreworICBpZiAodHAgPT0gbnVsbHB0 cikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICByZXR1cm4gKHplX3RocmVhZF9pbmZvICopIHRw LT50YXJnZXRfZGF0YSAoKTsKK30KKworLyogUmV0dXJuIHRoZSBaRSB0aHJlYWQgaW5mbyBmb3Ig Y29uc3QgVFAuICAqLworCitzdGF0aWMgaW5saW5lCitjb25zdCB6ZV90aHJlYWRfaW5mbyAqCit6 ZV90aHJlYWQgKGNvbnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgaWYgKHRwID09IG51bGxwdHIp CisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIChjb25zdCB6ZV90aHJlYWRfaW5mbyAq KSB0cC0+dGFyZ2V0X2RhdGEgKCk7Cit9CisKKy8qIFJldHVybiB0aGUgTGV2ZWwtWmVybyB0aHJl YWQgaWQgZm9yIGFsbCB0aHJlYWRzLiAgKi8KKworc3RhdGljIGlubGluZSB6ZV9kZXZpY2VfdGhy ZWFkX3QKK3plX3RocmVhZF9pZF9hbGwgKCkKK3sKKyAgemVfZGV2aWNlX3RocmVhZF90IGFsbDsK KyAgYWxsLnNsaWNlID0gVUlOVDMyX01BWDsKKyAgYWxsLnN1YnNsaWNlID0gVUlOVDMyX01BWDsK KyAgYWxsLmV1ID0gVUlOVDMyX01BWDsKKyAgYWxsLnRocmVhZCA9IFVJTlQzMl9NQVg7CisKKyAg cmV0dXJuIGFsbDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgVElEIGlzIHRoZSBhbGwgdGhyZWFk IGlkLiAgKi8KKworc3RhdGljIGlubGluZSBib29sCit6ZV9pc190aHJlYWRfaWRfYWxsICh6ZV9k ZXZpY2VfdGhyZWFkX3QgdGlkKQoreworICByZXR1cm4gKHRpZC5zbGljZSA9PSBVSU5UMzJfTUFY CisJICAmJiB0aWQuc3Vic2xpY2UgPT0gVUlOVDMyX01BWAorCSAgJiYgdGlkLmV1ID09IFVJTlQz Ml9NQVgKKwkgICYmIHRpZC50aHJlYWQgPT0gVUlOVDMyX01BWCk7Cit9CisKKy8qIFJldHVybiB0 aGUgTGV2ZWwtWmVybyB0aHJlYWQgaWQgZm9yIFRIUkVBRC4gICovCisKK3N0YXRpYyBpbmxpbmUg emVfZGV2aWNlX3RocmVhZF90Cit6ZV90aHJlYWRfaWQgKGNvbnN0IHRocmVhZF9pbmZvICp0aHJl YWQpCit7CisgIGNvbnN0IHplX3RocmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFkICh0aHJlYWQp OworICBpZiAoemV0cCA9PSBudWxscHRyKQorICAgIGVycm9yIChfKCJObyB0aHJlYWQuIikpOwor CisgIHJldHVybiB6ZXRwLT5pZDsKK30KKworLyogUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgZGV2 aWNlIHRocmVhZCBpZCBzdHJpbmcuICAqLworCitleHRlcm4gc3RkOjpzdHJpbmcgemVfdGhyZWFk X2lkX3N0ciAoY29uc3QgemVfZGV2aWNlX3RocmVhZF90ICZ0aHJlYWQpOworCisvKiBUaGUgc3Rh dGUgb2YgYSBwcm9jZXNzLiAgKi8KKworZW51bSB6ZV9wcm9jZXNzX3N0YXRlCit7CisgIC8qIFRo ZSBwcm9jZXNzIGlzIHZpc2libGUgdG8gdGhlIHVzZXIuICAqLworICBaRV9QUk9DRVNTX1ZJU0lC TEUsCisKKyAgLyogVGhlIHByb2Nlc3MgaXMgaGlkZGVuIGZyb20gdGhlIHVzZXIuICAqLworICBa RV9QUk9DRVNTX0hJRERFTgorfTsKKworLyogUHJvY2VzcyBpbmZvIHByaXZhdGUgZGF0YSBmb3Ig TGV2ZWwtWmVybyB0YXJnZXRzLiAgKi8KKworc3RydWN0IHByb2Nlc3NfaW5mb19wcml2YXRlCit7 CisgIC8qIFRoZSBkZXZpY2Ugd2UncmUgbW9kZWxsaW5nIGFzIHByb2Nlc3MuCisKKyAgICAgSW4g Y2FzZSB3ZSBnZXQgZm9yY2VmdWxseSBkZXRhY2hlZCBmcm9tIHRoZSBkZXZpY2UgdGhpcyBwcm9j ZXNzCisgICAgIHJlcHJlc2VudHMsIERFVklDRSB3aWxsIGJlIG51bGxwdHIuICBUaGUgcHJvY2Vz cyB3aWxsIHJlbWFpbiB1bnRpbAorICAgICB0aGUgZGV0YWNoIGV2ZW50IGNhbiBiZSByZXBvcnRl ZCB0byBHREIuICAqLworICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlOworCisgIC8qIFRoZSBzdGF0 ZSBvZiB0aGlzIHByb2Nlc3MuICAqLworICB6ZV9wcm9jZXNzX3N0YXRlIHN0YXRlOworCisgIC8q IFRoZSB3YWl0c3RhdHVzIGZvciB0aGlzIHByb2Nlc3MncyBsYXN0IGV2ZW50LgorCisgICAgIFdo aWxlIHN0b3AgZXZlbnRzIGFyZSByZXBvcnRlZCBvbiB0aHJlYWRzLCBtb2R1bGUgbG9hZHMgYW5k IHVubG9hZHMKKyAgICAgYXMgd2VsbCBhcyBlbnRyeSBhbmQgZXhpdCBhcmUgcmVwb3J0cyBvbiB0 aGUgcHJvY2VzcyBpdHNlbGYuCisKKyAgICAgTmVpdGhlciBvZiB0aGVzZSBldmVudHMgaW1wbGll cyB0aGF0IGFueSBvZiB0aGUgcHJvY2VzcycgdGhyZWFkcworICAgICBzdG9wcGVkIG9yIGlzIGV2 ZW4gYXZhaWxhYmxlLgorCisgICAgIFRBUkdFVF9XQUlUS0lORF9JR05PUkUgbWVhbnMgdGhhdCB0 aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydC4gICovCisgIHRhcmdldF93YWl0c3RhdHVzIHdhaXRz dGF0dXMge307CisKKyAgcHJvY2Vzc19pbmZvX3ByaXZhdGUgKHplX2RldmljZV9pbmZvICpkZXYs IHplX3Byb2Nlc3Nfc3RhdGUgc3QpCisgICAgOiBkZXZpY2UgKGRldiksIHN0YXRlIChzdCkKKyAg ICB7fQorfTsKKworLyogVGFyZ2V0IG9wIGRlZmluaXRpb25zIGZvciBMZXZlbC1aZXJvIGJhc2Vk IHRhcmdldHMuICAqLworCitjbGFzcyB6ZV90YXJnZXQgOiBwdWJsaWMgcHJvY2Vzc19zdHJhdHVt X3RhcmdldAoreworcHVibGljOgorICAvKiBJbml0aWFsaXplIHRoZSBMZXZlbC1aZXJvIHRhcmdl dC4KKworICAgICBXZSBjYW5ub3QgZG8gdGhpcyBpbnNpZGUgdGhlIGN0b3Igc2luY2UgemVJbml0 KCkgd291bGQgZ2VuZXJhdGUgYQorICAgICB3b3JrZXIgdGhyZWFkIHRoYXQgd291bGQgaW5oZXJp dCB0aGUgdW5pbml0aWFsaXplZCBhc3luYyBJL08KKyAgICAgc3RhdGUuCisKKyAgICAgUG9zdHBv bmUgaW5pdGlhbGl6YXRpb24gdW50aWwgYWZ0ZXIgYXN5bmMgSS9PIGhhcyBiZWVuCisgICAgIGlu aXRpYWxpemVkLiAgKi8KKyAgdm9pZCBpbml0ICgpOworCisgIGJvb2wgc3VwcG9ydHNfaGFyZHdh cmVfc2luZ2xlX3N0ZXAgKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHN1cHBv cnRzX3JhbmdlX3N0ZXBwaW5nICgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBz dXBwb3J0c19tdWx0aV9wcm9jZXNzICgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9v bCBzdXBwb3J0c19ub25fc3RvcCAoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIGludCBz dGFydF9ub25fc3RvcCAoYm9vbCBlbmFibGUpIG92ZXJyaWRlIHsgYXN5bmMgKGVuYWJsZSk7IHJl dHVybiAwOyB9CisKKyAgYm9vbCBhc3luYyAoYm9vbCBlbmFibGUpIG92ZXJyaWRlOworCisgIGlu dCBjcmVhdGVfaW5mZXJpb3IgKGNvbnN0IGNoYXIgKnByb2dyYW0sCisJCSAgICAgICBjb25zdCBz dGQ6OnZlY3RvcjxjaGFyICo+ICZhcmd2KSBvdmVycmlkZTsKKworICBpbnQgYXR0YWNoIChpbnQg cGlkKSBvdmVycmlkZTsKKyAgaW50IGRldGFjaCAocHJvY2Vzc19pbmZvICpwcm9jKSBvdmVycmlk ZTsKKworICBpbnQga2lsbCAocHJvY2Vzc19pbmZvICpwcm9jKSBvdmVycmlkZTsKKyAgdm9pZCBt b3VybiAocHJvY2Vzc19pbmZvICpwcm9jKSBvdmVycmlkZTsKKyAgdm9pZCBqb2luIChpbnQgcGlk KSBvdmVycmlkZTsKKworICB2b2lkIHJlc3VtZSAodGhyZWFkX3Jlc3VtZSAqcmVzdW1lX2luZm8s IHNpemVfdCBuKSBvdmVycmlkZTsKKyAgcHRpZF90IHdhaXQgKHB0aWRfdCBwdGlkLCB0YXJnZXRf d2FpdHN0YXR1cyAqc3RhdHVzLAorCSAgICAgICB0YXJnZXRfd2FpdF9mbGFncyBvcHRpb25zKSBv dmVycmlkZTsKKworICB2b2lkIGZldGNoX3JlZ2lzdGVycyAocmVnY2FjaGUgKnJlZ2NhY2hlLCBp bnQgcmVnbm8pIG92ZXJyaWRlOworICB2b2lkIHN0b3JlX3JlZ2lzdGVycyAocmVnY2FjaGUgKnJl Z2NhY2hlLCBpbnQgcmVnbm8pIG92ZXJyaWRlOworCisgIGludCByZWFkX21lbW9yeSAoQ09SRV9B RERSIG1lbWFkZHIsIHVuc2lnbmVkIGNoYXIgKm15YWRkciwKKwkJICAgaW50IGxlbikgb3ZlcnJp ZGU7CisKKyAgaW50IHdyaXRlX21lbW9yeSAoQ09SRV9BRERSIG1lbWFkZHIsIGNvbnN0IHVuc2ln bmVkIGNoYXIgKm15YWRkciwKKwkJICAgIGludCBsZW4pIG92ZXJyaWRlOworCisgIC8qIFdlIG1v ZGVsIGgvdyB0aHJlYWRzIC0gdGhleSBkbyBub3QgZXhpdC4gICovCisgIGJvb2wgdGhyZWFkX2Fs aXZlIChwdGlkX3QgcHRpZCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHN1cHBv cnRzX3RocmVhZF9zdG9wcGVkICgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB0 aHJlYWRfc3RvcHBlZCAoc3RydWN0IHRocmVhZF9pbmZvICp0cCkgb3ZlcnJpZGU7CisKKyAgdm9p ZCByZXF1ZXN0X2ludGVycnVwdCAoKSBvdmVycmlkZTsKKworICB2b2lkIHBhdXNlX2FsbCAoYm9v bCBmcmVlemUpIG92ZXJyaWRlOworICB2b2lkIHVucGF1c2VfYWxsIChib29sIHVuZnJlZXplKSBv dmVycmlkZTsKKworICBib29sIHN1cHBvcnRzX3BpZF90b19leGVjX2ZpbGUgKCkgb3ZlcnJpZGUg eyByZXR1cm4gdHJ1ZTsgfQorICBjb25zdCBjaGFyICpwaWRfdG9fZXhlY19maWxlIChpbnQgcGlk KSBvdmVycmlkZSB7IHJldHVybiAiIjsgfQorCisgIHZvaWQgYWNrX2xpYnJhcnkgKHByb2Nlc3Nf aW5mbyAqcHJvY2VzcywgY29uc3QgY2hhciAqbmFtZSkgb3ZlcnJpZGU7CisgIHZvaWQgYWNrX2lu X21lbW9yeV9saWJyYXJ5IChwcm9jZXNzX2luZm8gKnByb2Nlc3MsIENPUkVfQUREUiBiZWdpbiwK KwkJCSAgICAgIENPUkVfQUREUiBlbmQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICB0eXBlZGVm IHN0ZDo6bGlzdDx6ZV9kZXZpY2VfaW5mbyAqPiBkZXZpY2VzX3Q7CisKKyAgLyogVGhlIGRldmlj ZXMgd2UgY2FyZSBhYm91dC4gICovCisgIGRldmljZXNfdCBkZXZpY2VzOworCisgIC8qIFRoZSBj dXJyZW50IGRldmljZSBvcmRpbmFsIG51bWJlciB1c2VkIGZvciBlbnVtZXJhdGluZyBkZXZpY2Vz LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBvcmRpbmFsID0gMDsKKworICAvKiBUaGUgZnJlZXplIGNv dW50IGZvciBwYXVzZV9hbGwgKCkuICAqLworICB1aW50MzJfdCBmcm96ZW4gPSAwOworCisgIC8q IEF0dGFjaCB0byBQSUQgb24gZGV2aWNlcyBpbiB0aGUgZGV2aWNlIHRyZWUgcm9vdGVkIGF0IERF VklDRS4KKyAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRldmljZXMgd2UgYXR0YWNoZWQgdG8u ICAqLworICBpbnQgYXR0YWNoX3RvX2RldmljZSAodWludDMyX3QgcGlkLCB6ZV9kZXZpY2VfaGFu ZGxlX3QgZGV2aWNlKTsKKworICAvKiBBdHRhY2ggdG8gYWxsIGF2YWlsYWJsZSBkZXZpY2VzIGZv ciBwcm9jZXNzIFBJRCBhbmQgc3RvcmUgdGhlbSBpbgorICAgICB0aGlzIG9iamVjdC4gIFJldHVy bnMgdGhlIG51bWJlciBvZiBkZXZpY2VzIHdlIGF0dGFjaGVkIHRvLiAgKi8KKyAgaW50IGF0dGFj aF90b19kZXZpY2VzICh1aW50MzJfdCBwaWQpOworCisgIC8qIEZldGNoIGFuZCBwcm9jZXNzIGV2 ZW50cyBmcm9tIERFVklDRS4gIFJldHVybiBudW1iZXIgb2YgZXZlbnRzLiAgKi8KKyAgdWludDY0 X3QgZmV0Y2hfZXZlbnRzICh6ZV9kZXZpY2VfaW5mbyAmZGV2aWNlKTsKKworICAvKiBGZXRjaCBl dmVudHMgdW50aWwgbm8gZGV2aWNlIGhhcyBhbnkgcmVzdW1lZCB0aHJlYWRzIGxlZnQuICAqLwor ICB2b2lkIGZldGNoX2V2ZW50c19hbGxfZGV2aWNlc19ub19yZXN1bWVkICgpOworCisgIC8qIFJl dHVybiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCBtYXRjaCB0aGUgUkVTVU1FX1BUSUQgYW5k IGhhdmUKKyAgICAgbmV3IGV2ZW50cyB0byByZXBvcnQuICBBbHNvIHJlY292ZXIgdGhlc2UgdGhy ZWFkcycgcmVzdW1lIHN0YXRlCisgICAgIHRvIFJLSU5ELiAgKi8KKyAgc2l6ZV90IG1hcmtfZXZl bnRpbmdfdGhyZWFkcyAocHRpZF90IHJlc3VtZV9wdGlkLCBlbnVtIHJlc3VtZV9raW5kIHJraW5k KTsKKworICAvKiBSZXN1bWUgYWxsIHRocmVhZHMgb24gREVWSUNFLiAgKi8KKyAgdm9pZCByZXN1 bWUgKHplX2RldmljZV9pbmZvICZkZXZpY2UpOworCisgIC8qIFJlc3VtZSBhIHNpbmdsZSB0aHJl YWQuICBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0aGF0IHByZXBhcmVzCisgICAgIHRoZSB0aHJl YWQgZm9yIHJlc3VtaW5nLCBpbnZhbGlkYXRlcyBpdHMgcmVnY2FjaGUsIGFuZCB0aGVuCisgICAg IHJlc3VtZXMuICBUaGUgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHdlIGFyZSBz dXJlIHRoZQorICAgICB0aHJlYWQgc2hvdWxkIGJlIHJlc3VtZWQuICAqLworICB2b2lkIHJlc3Vt ZV9zaW5nbGVfdGhyZWFkICh0aHJlYWRfaW5mbyAqdGhyZWFkKTsKKworICAvKiBSZXR1cm4gdHJ1 ZSBpZiBUUCBoYXMgc2luZ2xlLXN0ZXBwZWQgd2l0aGluIGl0cyBzdGVwcGluZyByYW5nZS4gICov CisgIGJvb2wgaXNfcmFuZ2Vfc3RlcHBpbmcgKHRocmVhZF9pbmZvICp0cCk7CisKK3Byb3RlY3Rl ZDoKKyAgLyogQ2hlY2sgd2hldGhlciBhIGRldmljZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB0YXJn ZXQuICAqLworICB2aXJ0dWFsIGJvb2wgaXNfZGV2aWNlX3N1cHBvcnRlZAorICAgIChjb25zdCB6 ZV9kZXZpY2VfcHJvcGVydGllc190ICYsCisgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHpldF9kZWJ1 Z19yZWdzZXRfcHJvcGVydGllc190PiAmKSA9IDA7CisKKyAgLyogQ3JlYXRlIGEgdGFyZ2V0IGRl c2NyaXB0aW9uIGZvciBhIGRldmljZSBhbmQgcG9wdWxhdGUgdGhlCisgICAgIGNvcnJlc3BvbmRp bmcgcmVnc2V0IGluZm9ybWF0aW9uLiAgKi8KKyAgdmlydHVhbCB0YXJnZXRfZGVzYyAqY3JlYXRl X3RkZXNjCisgICAgKHplX2RldmljZV9pbmZvICpkaW5mbywKKyAgICAgY29uc3Qgc3RkOjp2ZWN0 b3I8emV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVzX3Q+ICYsCisgICAgIGNvbnN0IHplX3BjaV9l eHRfcHJvcGVydGllc190ICYpID0gMDsKKworICAvKiBSZXR1cm4gd2hldGhlciBUUCBpcyBhdCBh IGJyZWFrcG9pbnQuICAqLworICB2aXJ0dWFsIGJvb2wgaXNfYXRfYnJlYWtwb2ludCAodGhyZWFk X2luZm8gKnRwKSA9IDA7CisKKyAgLyogVFAgc3RvcHBlZC4gIEZpbmQgb3V0IHdoeSBhbmQgcmV0 dXJuIHRoZSBzdG9wIHJlYXNvbi4gIE9wdGlvbmFsbHkKKyAgICAgZmlsbCBpbiBTSUdOQUwuICAq LworICB2aXJ0dWFsIHRhcmdldF9zdG9wX3JlYXNvbiBnZXRfc3RvcF9yZWFzb24gKHRocmVhZF9p bmZvICp0cCwKKwkJCQkJICAgICAgZ2RiX3NpZ25hbCAmc2lnbmFsKSA9IDA7CisKKyAgLyogUHJl cGFyZSBUUCBmb3IgcmVzdW1pbmcgdXNpbmcgVFAncyBSRVNVTUVfU1RBVEUuCisKKyAgICAgVGhp cyBzZXRzIHRoZSB6ZSBleGVjdXRpb24gc3RhdGUsIHR5cGljYWxseSB0byBydW5uaW5nLiAgKi8K KyAgdmlydHVhbCB2b2lkIHByZXBhcmVfdGhyZWFkX3Jlc3VtZSAodGhyZWFkX2luZm8gKnRwKSA9 IDA7CisKKyAgLyogUmVhZCB0aGUgbWVtb3J5IGluIHRoZSBjb250ZXh0IG9mIHRocmVhZCBUUC4g ICovCisgIGludCByZWFkX21lbW9yeSAodGhyZWFkX2luZm8gKnRwLCBDT1JFX0FERFIgbWVtYWRk ciwKKwkJICAgdW5zaWduZWQgY2hhciAqbXlhZGRyLCBpbnQgbGVuKTsKKworICAvKiBXcml0ZSB0 aGUgbWVtb3J5IGluIHRoZSBjb250ZXh0IG9mIHRocmVhZCBUUC4gICovCisgIGludCB3cml0ZV9t ZW1vcnkgKHRocmVhZF9pbmZvICp0cCwgQ09SRV9BRERSIG1lbWFkZHIsCisJCSAgICBjb25zdCB1 bnNpZ25lZCBjaGFyICpteWFkZHIsIGludCBsZW4pOworfTsKKworI2VuZGlmIC8qIEdEQlNFUlZF Ul9MRVZFTF9aRVJPX0xPV19IICovCgotLSAKMi4zNC4xCgpJbnRlbCBEZXV0c2NobGFuZCBHbWJI DQpSZWdpc3RlcmVkIEFkZHJlc3M6IEFtIENhbXBlb24gMTAsIDg1NTc5IE5ldWJpYmVyZywgR2Vy bWFueQ0KVGVsOiArNDkgODkgOTkgODg1My0wLCB3d3cuaW50ZWwuZGUNCk1hbmFnaW5nIERpcmVj dG9yczogU2VhbiBGZW5uZWxseSwgSmVmZnJleSBTY2huZWlkZXJtYW4sIFRpZmZhbnkgRG9vbiBT aWx2YQ0KQ2hhaXJwZXJzb24gb2YgdGhlIFN1cGVydmlzb3J5IEJvYXJkOiBOaWNvbGUgTGF1DQpS ZWdpc3RlcmVkIE9mZmljZTogTXVuaWNoDQpDb21tZXJjaWFsIFJlZ2lzdGVyOiBBbXRzZ2VyaWNo dCBNdWVuY2hlbiBIUkIgMTg2OTI4Cg==