From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3FD4C433E0 for ; Wed, 20 Jan 2021 03:47:44 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 41AD822B42 for ; Wed, 20 Jan 2021 03:47:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 41AD822B42 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=quicinc.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:59572 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l24T9-0002dy-8y for qemu-devel@archiver.kernel.org; Tue, 19 Jan 2021 22:47:43 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47666) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l24C9-0007xX-QX for qemu-devel@nongnu.org; Tue, 19 Jan 2021 22:30:14 -0500 Received: from alexa-out-sd-01.qualcomm.com ([199.106.114.38]:5511) by eggs.gnu.org with esmtps (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l24C5-0007VU-AE for qemu-devel@nongnu.org; Tue, 19 Jan 2021 22:30:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1611113405; x=1642649405; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qa6tMoXVmvj9d6rkDH6Vyl38TLEQp/gltNZEr/PgkR4=; b=ECjPeSFOt5UOxYXyjnFtvAnO34F+ZRKCE6BTRSbet7PotQyLEW6yGgZH Q5knlybi6qvdF0iaaLp2TMT2yE32LYGOTjYNVNZ3n/Ql384fhw7zI1Elz hHkADGR2kCyu/df9aptvyMSQBxLOAK7zW46cQQoAoTziAMiIInumV0sNx E=; Received: from unknown (HELO ironmsg04-sd.qualcomm.com) ([10.53.140.144]) by alexa-out-sd-01.qualcomm.com with ESMTP; 19 Jan 2021 19:29:26 -0800 X-QCInternal: smtphost Received: from vu-tsimpson-aus.qualcomm.com (HELO vu-tsimpson1-aus.qualcomm.com) ([10.222.150.1]) by ironmsg04-sd.qualcomm.com with ESMTP; 19 Jan 2021 19:29:26 -0800 Received: by vu-tsimpson1-aus.qualcomm.com (Postfix, from userid 47164) id AD46528DD; Tue, 19 Jan 2021 21:29:25 -0600 (CST) From: Taylor Simpson To: qemu-devel@nongnu.org Subject: [PATCH v7 17/35] Hexagon (target/hexagon/fma_emu.[ch]) utility functions Date: Tue, 19 Jan 2021 21:28:50 -0600 Message-Id: <1611113349-24906-18-git-send-email-tsimpson@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1611113349-24906-1-git-send-email-tsimpson@quicinc.com> References: <1611113349-24906-1-git-send-email-tsimpson@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Received-SPF: pass client-ip=199.106.114.38; envelope-from=tsimpson@qualcomm.com; helo=alexa-out-sd-01.qualcomm.com X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.248, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ale@rev.ng, bcain@quicinc.com, philmd@redhat.com, richard.henderson@linaro.org, laurent@vivier.eu, tsimpson@quicinc.com, alex.bennee@linaro.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" U2lnbmVkLW9mZi1ieTogVGF5bG9yIFNpbXBzb24gPHRzaW1wc29uQHF1aWNpbmMuY29tPgotLS0K IHRhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaCB8ICAzNyArKysKIHRhcmdldC9oZXhhZ29uL2ZtYV9l bXUuYyB8IDcwMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogMiBmaWxlcyBjaGFuZ2VkLCA3MzkgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IHRhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhh Z29uL2ZtYV9lbXUuYwoKZGlmZiAtLWdpdCBhL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaCBiL3Rh cmdldC9oZXhhZ29uL2ZtYV9lbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5jMzg5NmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5oCkBA IC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgQ29weXJpZ2h0KGMpIDIwMTktMjAyMSBRdWFsY29tbSBJ bm5vdmF0aW9uIENlbnRlciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBIRVhBR09OX0ZN QV9FTVVfSAorI2RlZmluZSBIRVhBR09OX0ZNQV9FTVVfSAorCitzdGF0aWMgaW5saW5lIGJvb2wg aXNfZmluaXRlKGZsb2F0NjQgeCkKK3sKKyAgICByZXR1cm4gIWZsb2F0NjRfaXNfYW55X25hbih4 KSAmJiAhZmxvYXQ2NF9pc19pbmZpbml0eSh4KTsKK30KKworZXh0ZXJuIGludDMyX3QgZmxvYXQ2 NF9nZXRleHAoZmxvYXQ2NCBmNjQpOworZXh0ZXJuIGludDMyX3QgZmxvYXQzMl9nZXRleHAoZmxv YXQzMiBmMzIpOworZXh0ZXJuIGZsb2F0MzIgaW5maW5pdGVfZmxvYXQzMih1aW50OF90IHNpZ24p OworZXh0ZXJuIGZsb2F0MzIgaW50ZXJuYWxfZm1hZngoZmxvYXQzMiBhLCBmbG9hdDMyIGIsIGZs b2F0MzIgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZSwgZmxvYXRf c3RhdHVzICpmcF9zdGF0dXMpOworZXh0ZXJuIGZsb2F0MzIgaW50ZXJuYWxfbXB5ZihmbG9hdDMy IGEsIGZsb2F0MzIgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfc3RhdHVz ICpmcF9zdGF0dXMpOworZXh0ZXJuIGZsb2F0NjQgaW50ZXJuYWxfbXB5aGgoZmxvYXQ2NCBhLCBm bG9hdDY0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxv bmcgaW50IGFjY3VtdWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRf c3RhdHVzICpmcF9zdGF0dXMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9oZXhhZ29u L2ZtYV9lbXUuYyBiL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi44NDJkOTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2hleGFn b24vZm1hX2VtdS5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogIENvcHlyaWdodChjKSAyMDE5 LTIwMjEgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZl ZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisg KiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh bTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNp bmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAicWVtdS9pbnQxMjguaCIKKyNpbmNsdWRl ICJmcHUvc29mdGZsb2F0LmgiCisjaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSAiY29udl9l bXUuaCIKKyNpbmNsdWRlICJmbWFfZW11LmgiCisKKyNkZWZpbmUgREZfSU5GX0VYUCAgICAgMHg3 ZmYKKyNkZWZpbmUgREZfQklBUyAgICAgICAgMTAyMworI2RlZmluZSBERl9NQU5UQklUUyAgICA1 MgorI2RlZmluZSBERl9OQU4gICAgICAgICAweGZmZmZmZmZmZmZmZmZmZmZVTEwKKyNkZWZpbmUg REZfSU5GICAgICAgICAgMHg3ZmYwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIERGX01JTlVTX0lO RiAgIDB4ZmZmMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBERl9NQVhGICAgICAgICAweDdmZWZm ZmZmZmZmZmZmZmZVTEwKKyNkZWZpbmUgREZfTUlOVVNfTUFYRiAgMHhmZmVmZmZmZmZmZmZmZmZm VUxMCisKKyNkZWZpbmUgU0ZfSU5GX0VYUCAgICAgMHhmZgorI2RlZmluZSBTRl9CSUFTICAgICAg ICAxMjcKKyNkZWZpbmUgU0ZfTUFOVEJJVFMgICAgMjMKKyNkZWZpbmUgU0ZfSU5GICAgICAgICAg MHg3ZjgwMDAwMAorI2RlZmluZSBTRl9NSU5VU19JTkYgICAweGZmODAwMDAwCisjZGVmaW5lIFNG X01BWEYgICAgICAgIDB4N2Y3ZmZmZmYKKyNkZWZpbmUgU0ZfTUlOVVNfTUFYRiAgMHhmZjdmZmZm ZgorCisjZGVmaW5lIEhGX0lORl9FWFAgMHgxZgorI2RlZmluZSBIRl9CSUFTIDE1CisKKyNkZWZp bmUgV0FZX0JJR19FWFAgNDA5NgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICBkb3VibGUgZjsKKyAg ICB1aW50NjRfdCBpOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IG1hbnQ6NTI7Cisg ICAgICAgIHVpbnQ2NF90IGV4cDoxMTsKKyAgICAgICAgdWludDY0X3Qgc2lnbjoxOworICAgIH07 Cit9IERvdWJsZTsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgZmxvYXQgZjsKKyAgICB1aW50MzJf dCBpOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IG1hbnQ6MjM7CisgICAgICAgIHVp bnQzMl90IGV4cDo4OworICAgICAgICB1aW50MzJfdCBzaWduOjE7CisgICAgfTsKK30gRmxvYXQ7 CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZmxvYXQ2NF9nZXRtYW50KGZsb2F0NjQgZjY0KQor eworICAgIERvdWJsZSBhID0geyAuaSA9IGY2NCB9OworICAgIGlmIChmbG9hdDY0X2lzX25vcm1h bChmNjQpKSB7CisgICAgICAgIHJldHVybiBhLm1hbnQgfCAxVUxMIDw8IDUyOworICAgIH0KKyAg ICBpZiAoZmxvYXQ2NF9pc196ZXJvKGY2NCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor ICAgIGlmIChmbG9hdDY0X2lzX2Rlbm9ybWFsKGY2NCkpIHsKKyAgICAgICAgcmV0dXJuIGEubWFu dDsKKyAgICB9CisgICAgcmV0dXJuIH4wVUxMOworfQorCitpbnQzMl90IGZsb2F0NjRfZ2V0ZXhw KGZsb2F0NjQgZjY0KQoreworICAgIERvdWJsZSBhID0geyAuaSA9IGY2NCB9OworICAgIGlmIChm bG9hdDY0X2lzX25vcm1hbChmNjQpKSB7CisgICAgICAgIHJldHVybiBhLmV4cDsKKyAgICB9Cisg ICAgaWYgKGZsb2F0NjRfaXNfZGVub3JtYWwoZjY0KSkgeworICAgICAgICByZXR1cm4gYS5leHAg KyAxOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qg ZmxvYXQzMl9nZXRtYW50KGZsb2F0MzIgZjMyKQoreworICAgIEZsb2F0IGEgPSB7IC5pID0gZjMy IH07CisgICAgaWYgKGZsb2F0MzJfaXNfbm9ybWFsKGYzMikpIHsKKyAgICAgICAgcmV0dXJuIGEu bWFudCB8IDFVTEwgPDwgMjM7CisgICAgfQorICAgIGlmIChmbG9hdDMyX2lzX3plcm8oZjMyKSkg eworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGZsb2F0MzJfaXNfZGVub3JtYWwo ZjMyKSkgeworICAgICAgICByZXR1cm4gYS5tYW50OworICAgIH0KKyAgICByZXR1cm4gfjBVTEw7 Cit9CisKK2ludDMyX3QgZmxvYXQzMl9nZXRleHAoZmxvYXQzMiBmMzIpCit7CisgICAgRmxvYXQg YSA9IHsgLmkgPSBmMzIgfTsKKyAgICBpZiAoZmxvYXQzMl9pc19ub3JtYWwoZjMyKSkgeworICAg ICAgICByZXR1cm4gYS5leHA7CisgICAgfQorICAgIGlmIChmbG9hdDMyX2lzX2Rlbm9ybWFsKGYz MikpIHsKKyAgICAgICAgcmV0dXJuIGEuZXhwICsgMTsKKyAgICB9CisgICAgcmV0dXJuIC0xOwor fQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGludDEyOF9nZXR3MChJbnQxMjggeCkKK3sKKyAg ICByZXR1cm4gaW50MTI4X2dldGxvKHgpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGlu dDEyOF9nZXR3MShJbnQxMjggeCkKK3sKKyAgICByZXR1cm4gaW50MTI4X2dldGxvKHgpID4+IDMy OworfQorCitzdGF0aWMgaW5saW5lIEludDEyOCBpbnQxMjhfbXVsXzY0NjQodWludDY0X3QgYWks IHVpbnQ2NF90IGJpKQoreworICAgIEludDEyOCBhLCBiOworICAgIHVpbnQ2NF90IHBwMCwgcHAx YSwgcHAxYiwgcHAxcywgcHAyOworCisgICAgYSA9IGludDEyOF9tYWtlNjQoYWkpOworICAgIGIg PSBpbnQxMjhfbWFrZTY0KGJpKTsKKyAgICBwcDAgPSAodWludDY0X3QpaW50MTI4X2dldHcwKGEp ICogKHVpbnQ2NF90KWludDEyOF9nZXR3MChiKTsKKyAgICBwcDFhID0gKHVpbnQ2NF90KWludDEy OF9nZXR3MShhKSAqICh1aW50NjRfdClpbnQxMjhfZ2V0dzAoYik7CisgICAgcHAxYiA9ICh1aW50 NjRfdClpbnQxMjhfZ2V0dzEoYikgKiAodWludDY0X3QpaW50MTI4X2dldHcwKGEpOworICAgIHBw MiA9ICh1aW50NjRfdClpbnQxMjhfZ2V0dzEoYSkgKiAodWludDY0X3QpaW50MTI4X2dldHcxKGIp OworCisgICAgcHAxcyA9IHBwMWEgKyBwcDFiOworICAgIGlmICgocHAxcyA8IHBwMWEpIHx8IChw cDFzIDwgcHAxYikpIHsKKyAgICAgICAgcHAyICs9ICgxVUxMIDw8IDMyKTsKKyAgICB9CisgICAg dWludDY0X3QgcmV0X2xvdyA9IHBwMCArIChwcDFzIDw8IDMyKTsKKyAgICBpZiAoKHJldF9sb3cg PCBwcDApIHx8IChyZXRfbG93IDwgKHBwMXMgPDwgMzIpKSkgeworICAgICAgICBwcDIgKz0gMTsK KyAgICB9CisKKyAgICByZXR1cm4gaW50MTI4X21ha2UxMjgocmV0X2xvdywgcHAyICsgKHBwMXMg Pj4gMzIpKTsKK30KKworc3RhdGljIGlubGluZSBJbnQxMjggaW50MTI4X3N1Yl9ib3Jyb3coSW50 MTI4IGEsIEludDEyOCBiLCBpbnQgYm9ycm93KQoreworICAgIEludDEyOCByZXQgPSBpbnQxMjhf c3ViKGEsIGIpOworICAgIGlmIChib3Jyb3cgIT0gMCkgeworICAgICAgICByZXQgPSBpbnQxMjhf c3ViKHJldCwgaW50MTI4X29uZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordHlw ZWRlZiBzdHJ1Y3QgeworICAgIEludDEyOCBtYW50OworICAgIGludDMyX3QgZXhwOworICAgIHVp bnQ4X3Qgc2lnbjsKKyAgICB1aW50OF90IGd1YXJkOworICAgIHVpbnQ4X3Qgcm91bmQ7CisgICAg dWludDhfdCBzdGlja3k7Cit9IEFjY3VtOworCitzdGF0aWMgaW5saW5lIHZvaWQgYWNjdW1faW5p dChBY2N1bSAqcCkKK3sKKyAgICBwLT5tYW50ID0gaW50MTI4X3plcm8oKTsKKyAgICBwLT5leHAg PSAwOworICAgIHAtPnNpZ24gPSAwOworICAgIHAtPmd1YXJkID0gMDsKKyAgICBwLT5yb3VuZCA9 IDA7CisgICAgcC0+c3RpY2t5ID0gMDsKK30KKworc3RhdGljIGlubGluZSBBY2N1bSBhY2N1bV9u b3JtX2xlZnQoQWNjdW0gYSkKK3sKKyAgICBhLmV4cC0tOworICAgIGEubWFudCA9IGludDEyOF9s c2hpZnQoYS5tYW50LCAxKTsKKyAgICBhLm1hbnQgPSBpbnQxMjhfb3IoYS5tYW50LCBpbnQxMjhf bWFrZTY0KGEuZ3VhcmQpKTsKKyAgICBhLmd1YXJkID0gYS5yb3VuZDsKKyAgICBhLnJvdW5kID0g YS5zdGlja3k7CisgICAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgQWNjdW0gYWNjdW1f bm9ybV9yaWdodChBY2N1bSBhLCBpbnQgYW10KQoreworICAgIGlmIChhbXQgPiAxMzApIHsKKyAg ICAgICAgYS5zdGlja3kgfD0KKyAgICAgICAgICAgIGEucm91bmQgfCBhLmd1YXJkIHwgaW50MTI4 X256KGEubWFudCk7CisgICAgICAgIGEuZ3VhcmQgPSBhLnJvdW5kID0gMDsKKyAgICAgICAgYS5t YW50ID0gaW50MTI4X3plcm8oKTsKKyAgICAgICAgYS5leHAgKz0gYW10OworICAgICAgICByZXR1 cm4gYTsKKworICAgIH0KKyAgICB3aGlsZSAoYW10ID49IDY0KSB7CisgICAgICAgIGEuc3RpY2t5 IHw9IGEucm91bmQgfCBhLmd1YXJkIHwgKGludDEyOF9nZXRsbyhhLm1hbnQpICE9IDApOworICAg ICAgICBhLmd1YXJkID0gKGludDEyOF9nZXRsbyhhLm1hbnQpID4+IDYzKSAmIDE7CisgICAgICAg IGEucm91bmQgPSAoaW50MTI4X2dldGxvKGEubWFudCkgPj4gNjIpICYgMTsKKyAgICAgICAgYS5t YW50ID0gaW50MTI4X21ha2U2NChpbnQxMjhfZ2V0aGkoYS5tYW50KSk7CisgICAgICAgIGEuZXhw ICs9IDY0OworICAgICAgICBhbXQgLT0gNjQ7CisgICAgfQorICAgIHdoaWxlIChhbXQgPiAwKSB7 CisgICAgICAgIGEuZXhwKys7CisgICAgICAgIGEuc3RpY2t5IHw9IGEucm91bmQ7CisgICAgICAg IGEucm91bmQgPSBhLmd1YXJkOworICAgICAgICBhLmd1YXJkID0gaW50MTI4X2dldGxvKGEubWFu dCkgJiAxOworICAgICAgICBhLm1hbnQgPSBpbnQxMjhfcnNoaWZ0KGEubWFudCwgMSk7CisgICAg ICAgIGFtdC0tOworICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworLyoKKyAqIE9uIHRoZSBhZGQv c3ViLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc2hpZnQgb3V0IGxvdHMgb2YgYml0cywgYnV0IG5l ZWQgYQorICogc3RpY2t5IGJpdCBmb3Igd2hhdCB3YXMgc2hpZnRlZCBvdXQsIEkgdGhpbmsuCisg Ki8KK3N0YXRpYyBBY2N1bSBhY2N1bV9hZGQoQWNjdW0gYSwgQWNjdW0gYik7CisKK3N0YXRpYyBp bmxpbmUgQWNjdW0gYWNjdW1fc3ViKEFjY3VtIGEsIEFjY3VtIGIsIGludCBuZWdhdGUpCit7Cisg ICAgQWNjdW0gcmV0OworICAgIGFjY3VtX2luaXQoJnJldCk7CisgICAgaW50IGJvcnJvdzsKKwor ICAgIGlmIChhLnNpZ24gIT0gYi5zaWduKSB7CisgICAgICAgIGIuc2lnbiA9ICFiLnNpZ247Cisg ICAgICAgIHJldHVybiBhY2N1bV9hZGQoYSwgYik7CisgICAgfQorICAgIGlmIChiLmV4cCA+IGEu ZXhwKSB7CisgICAgICAgIC8qIHNtYWxsIC0gYmlnID09IC0gKGJpZyAtIHNtYWxsKSAqLworICAg ICAgICByZXR1cm4gYWNjdW1fc3ViKGIsIGEsICFuZWdhdGUpOworICAgIH0KKyAgICBpZiAoKGIu ZXhwID09IGEuZXhwKSAmJiAoaW50MTI4X2d0KGIubWFudCwgYS5tYW50KSkpIHsKKyAgICAgICAg Lyogc21hbGwgLSBiaWcgPT0gLSAoYmlnIC0gc21hbGwpICovCisgICAgICAgIHJldHVybiBhY2N1 bV9zdWIoYiwgYSwgIW5lZ2F0ZSk7CisgICAgfQorCisgICAgd2hpbGUgKGEuZXhwID4gYi5leHAp IHsKKyAgICAgICAgLyogVHJ5IHRvIG5vcm1hbGl6ZSBleHBvbmVudHM6IHNocmluayBhIGV4cG9u ZW50IGFuZCBncm93IG1hbnRpc3NhICovCisgICAgICAgIGlmIChpbnQxMjhfZ2V0aGkoYS5tYW50 KSAmICgxVUxMIDw8IDYyKSkgeworICAgICAgICAgICAgLyogQ2FuJ3QgZ3JvdyBhIGFueSBtb3Jl ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGEg PSBhY2N1bV9ub3JtX2xlZnQoYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoYS5l eHAgPiBiLmV4cCkgeworICAgICAgICAvKiBUcnkgdG8gbm9ybWFsaXplIGV4cG9uZW50czogZ3Jv dyBiIGV4cG9uZW50IGFuZCBzaHJpbmsgbWFudGlzc2EgKi8KKyAgICAgICAgLyogS2VlcCBhcm91 bmQgc2hpZnRlZCBvdXQgYml0cy4uLiB3ZSBtaWdodCBuZWVkIHRob3NlIGxhdGVyICovCisgICAg ICAgIGIgPSBhY2N1bV9ub3JtX3JpZ2h0KGIsIGEuZXhwIC0gYi5leHApOworICAgIH0KKworICAg IGlmICgoaW50MTI4X2d0KGIubWFudCwgYS5tYW50KSkpIHsKKyAgICAgICAgcmV0dXJuIGFjY3Vt X3N1YihiLCBhLCAhbmVnYXRlKTsKKyAgICB9CisKKyAgICAvKiBPSywgbm93IHRoaW5ncyBzaG91 bGQgYmUgbm9ybWFsaXplZCEgKi8KKyAgICByZXQuc2lnbiA9IGEuc2lnbjsKKyAgICByZXQuZXhw ID0gYS5leHA7CisgICAgYXNzZXJ0KCFpbnQxMjhfZ3QoYi5tYW50LCBhLm1hbnQpKTsKKyAgICBi b3Jyb3cgPSAoYi5yb3VuZCA8PCAyKSB8IChiLmd1YXJkIDw8IDEpIHwgYi5zdGlja3k7CisgICAg cmV0Lm1hbnQgPSBpbnQxMjhfc3ViX2JvcnJvdyhhLm1hbnQsIGIubWFudCwgKGJvcnJvdyAhPSAw KSk7CisgICAgYm9ycm93ID0gMCAtIGJvcnJvdzsKKyAgICByZXQuZ3VhcmQgPSAoYm9ycm93ID4+ IDIpICYgMTsKKyAgICByZXQucm91bmQgPSAoYm9ycm93ID4+IDEpICYgMTsKKyAgICByZXQuc3Rp Y2t5ID0gKGJvcnJvdyA+PiAwKSAmIDE7CisgICAgaWYgKG5lZ2F0ZSkgeworICAgICAgICByZXQu c2lnbiA9ICFyZXQuc2lnbjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEFj Y3VtIGFjY3VtX2FkZChBY2N1bSBhLCBBY2N1bSBiKQoreworICAgIEFjY3VtIHJldDsKKyAgICBh Y2N1bV9pbml0KCZyZXQpOworICAgIGlmIChhLnNpZ24gIT0gYi5zaWduKSB7CisgICAgICAgIGIu c2lnbiA9ICFiLnNpZ247CisgICAgICAgIHJldHVybiBhY2N1bV9zdWIoYSwgYiwgMCk7CisgICAg fQorICAgIGlmIChiLmV4cCA+IGEuZXhwKSB7CisgICAgICAgIC8qIHNtYWxsICsgYmlnID09ICAo YmlnICsgc21hbGwpICovCisgICAgICAgIHJldHVybiBhY2N1bV9hZGQoYiwgYSk7CisgICAgfQor ICAgIGlmICgoYi5leHAgPT0gYS5leHApICYmIGludDEyOF9ndChiLm1hbnQsIGEubWFudCkpIHsK KyAgICAgICAgLyogc21hbGwgKyBiaWcgPT0gIChiaWcgKyBzbWFsbCkgKi8KKyAgICAgICAgcmV0 dXJuIGFjY3VtX2FkZChiLCBhKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYS5leHAgPiBiLmV4cCkg eworICAgICAgICAvKiBUcnkgdG8gbm9ybWFsaXplIGV4cG9uZW50czogc2hyaW5rIGEgZXhwb25l bnQgYW5kIGdyb3cgbWFudGlzc2EgKi8KKyAgICAgICAgaWYgKGludDEyOF9nZXRoaShhLm1hbnQp ICYgKDFVTEwgPDwgNjIpKSB7CisgICAgICAgICAgICAvKiBDYW4ndCBncm93IGEgYW55IG1vcmUg Ki8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYSA9 IGFjY3VtX25vcm1fbGVmdChhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChhLmV4 cCA+IGIuZXhwKSB7CisgICAgICAgIC8qIFRyeSB0byBub3JtYWxpemUgZXhwb25lbnRzOiBncm93 IGIgZXhwb25lbnQgYW5kIHNocmluayBtYW50aXNzYSAqLworICAgICAgICAvKiBLZWVwIGFyb3Vu ZCBzaGlmdGVkIG91dCBiaXRzLi4uIHdlIG1pZ2h0IG5lZWQgdGhvc2UgbGF0ZXIgKi8KKyAgICAg ICAgYiA9IGFjY3VtX25vcm1fcmlnaHQoYiwgYS5leHAgLSBiLmV4cCk7CisgICAgfQorCisgICAg LyogT0ssIG5vdyB0aGluZ3Mgc2hvdWxkIGJlIG5vcm1hbGl6ZWQhICovCisgICAgaWYgKGludDEy OF9ndChiLm1hbnQsIGEubWFudCkpIHsKKyAgICAgICAgcmV0dXJuIGFjY3VtX2FkZChiLCBhKTsK KyAgICB9OworICAgIHJldC5zaWduID0gYS5zaWduOworICAgIHJldC5leHAgPSBhLmV4cDsKKyAg ICBhc3NlcnQoIWludDEyOF9ndChiLm1hbnQsIGEubWFudCkpOworICAgIHJldC5tYW50ID0gaW50 MTI4X2FkZChhLm1hbnQsIGIubWFudCk7CisgICAgcmV0Lmd1YXJkID0gYi5ndWFyZDsKKyAgICBy ZXQucm91bmQgPSBiLnJvdW5kOworICAgIHJldC5zdGlja3kgPSBiLnN0aWNreTsKKyAgICByZXR1 cm4gcmV0OworfQorCisvKiBSZXR1cm4gYW4gaW5maW5pdHkgd2l0aCByZXF1ZXN0ZWQgc2lnbiAq Lworc3RhdGljIGlubGluZSBmbG9hdDY0IGluZmluaXRlX2Zsb2F0NjQodWludDhfdCBzaWduKQor eworICAgIGlmIChzaWduKSB7CisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0NjQoREZfTUlOVVNf SU5GKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbWFrZV9mbG9hdDY0KERGX0lORik7 CisgICAgfQorfQorCisvKiBSZXR1cm4gYSBtYXhpbXVtIGZpbml0ZSB2YWx1ZSB3aXRoIHJlcXVl c3RlZCBzaWduICovCitzdGF0aWMgaW5saW5lIGZsb2F0NjQgbWF4ZmluaXRlX2Zsb2F0NjQodWlu dDhfdCBzaWduKQoreworICAgIGlmIChzaWduKSB7CisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0 NjQoREZfTUlOVVNfTUFYRik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1ha2VfZmxv YXQ2NChERl9NQVhGKTsKKyAgICB9Cit9CisKKy8qIFJldHVybiBhIHplcm8gdmFsdWUgd2l0aCBy ZXF1ZXN0ZWQgc2lnbiAqLworc3RhdGljIGlubGluZSBmbG9hdDY0IHplcm9fZmxvYXQ2NCh1aW50 OF90IHNpZ24pCit7CisgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgcmV0dXJuIG1ha2VfZmxvYXQ2 NCgweDgwMDAwMDAwMDAwMDAwMDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmbG9h dDY0X3plcm87CisgICAgfQorfQorCisvKiBSZXR1cm4gYW4gaW5maW5pdHkgd2l0aCB0aGUgcmVx dWVzdGVkIHNpZ24gKi8KK2Zsb2F0MzIgaW5maW5pdGVfZmxvYXQzMih1aW50OF90IHNpZ24pCit7 CisgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgcmV0dXJuIG1ha2VfZmxvYXQzMihTRl9NSU5VU19J TkYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0MzIoU0ZfSU5GKTsK KyAgICB9Cit9CisKKy8qIFJldHVybiBhIG1heGltdW0gZmluaXRlIHZhbHVlIHdpdGggdGhlIHJl cXVlc3RlZCBzaWduICovCitzdGF0aWMgaW5saW5lIGZsb2F0MzIgbWF4ZmluaXRlX2Zsb2F0MzIo dWludDhfdCBzaWduKQoreworICAgIGlmIChzaWduKSB7CisgICAgICAgIHJldHVybiBtYWtlX2Zs b2F0MzIoU0ZfTUlOVVNfTUFYRik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1ha2Vf ZmxvYXQzMihTRl9NQVhGKTsKKyAgICB9Cit9CisKKy8qIFJldHVybiBhIHplcm8gdmFsdWUgd2l0 aCByZXF1ZXN0ZWQgc2lnbiAqLworc3RhdGljIGlubGluZSBmbG9hdDMyIHplcm9fZmxvYXQzMih1 aW50OF90IHNpZ24pCit7CisgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgcmV0dXJuIG1ha2VfZmxv YXQzMigweDgwMDAwMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmxvYXQzMl96 ZXJvOworICAgIH0KK30KKworI2RlZmluZSBHRU5fWEZfUk9VTkQoU1VGRklYLCBNQU5UQklUUywg SU5GX0VYUCwgSU5URVJOQUxfVFlQRSkgXAorc3RhdGljIGlubGluZSBTVUZGSVggYWNjdW1fcm91 bmRfIyNTVUZGSVgoQWNjdW0gYSwgZmxvYXRfc3RhdHVzICogZnBfc3RhdHVzKSBcCit7IFwKKyAg ICBpZiAoKGludDEyOF9nZXRoaShhLm1hbnQpID09IDApICYmIChpbnQxMjhfZ2V0bG8oYS5tYW50 KSA9PSAwKSBcCisgICAgICAgICYmICgoYS5ndWFyZCB8IGEucm91bmQgfCBhLnN0aWNreSkgPT0g MCkpIHsgXAorICAgICAgICAvKiByZXN1bHQgemVybyAqLyBcCisgICAgICAgIHN3aXRjaCAoZnBf c3RhdHVzLT5mbG9hdF9yb3VuZGluZ19tb2RlKSB7IFwKKyAgICAgICAgY2FzZSBmbG9hdF9yb3Vu ZF9kb3duOiBcCisgICAgICAgICAgICByZXR1cm4gemVyb18jI1NVRkZJWCgxKTsgXAorICAgICAg ICBkZWZhdWx0OiBcCisgICAgICAgICAgICByZXR1cm4gemVyb18jI1NVRkZJWCgwKTsgXAorICAg ICAgICB9IFwKKyAgICB9IFwKKyAgICAvKiBOb3JtYWxpemUgcmlnaHQgKi8gXAorICAgIC8qIFdl IHdhbnQgTUFOVEJJVFMgYml0cyBvZiBtYW50aXNzYSBwbHVzIHRoZSBsZWFkaW5nIG9uZS4gKi8g XAorICAgIC8qIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IE1BTlRCSVRTKzEgYml0cywgb3IgMHgw MDAwMDAwMDAwMDBGRl9GRkZGICovIFwKKyAgICAvKiBTbyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSBy aWdodCB3aGlsZSB0aGUgaGlnaCB3b3JkIGlzIG5vbi16ZXJvIGFuZCBcCisgICAgKiB3aGlsZSB0 aGUgbG93IHdvcmQgaXMgbm9uemVybyB3aGVuIG1hc2tlZCB3aXRoIDB4ZmZlMF8wMDAwXzAwMDBf MDAwMCAqLyBcCisgICAgd2hpbGUgKChpbnQxMjhfZ2V0aGkoYS5tYW50KSAhPSAwKSB8fCBcCisg ICAgICAgICAgICgoaW50MTI4X2dldGxvKGEubWFudCkgPj4gKE1BTlRCSVRTICsgMSkpICE9IDAp KSB7IFwKKyAgICAgICAgYSA9IGFjY3VtX25vcm1fcmlnaHQoYSwgMSk7IFwKKyAgICB9IFwKKyAg ICAvKiBcCisgICAgICogT0ssIG5vdyBub3JtYWxpemUgbGVmdCBcCisgICAgICogV2Ugd2FudCB0 byBub3JtYWxpemUgbGVmdCB1bnRpbCB3ZSBoYXZlIGEgbGVhZGluZyBvbmUgaW4gYml0IDI0IFwK KyAgICAgKiBUaGVvcmV0aWNhbGx5LCB3ZSBvbmx5IG5lZWQgdG8gc2hpZnQgYSBtYXhpbXVtIG9m IG9uZSB0byB0aGUgbGVmdCBpZiB3ZSBcCisgICAgICogc2hpZnRlZCBvdXQgbG90cyBvZiBiaXRz IGZyb20gQiwgb3IgaWYgd2UgaGFkIG5vIHNoaWZ0IC8gMSBzaGlmdCBzdGlja3kgXAorICAgICAq IHNob3VkbCBiZSAwICBcCisgICAgICovIFwKKyAgICB3aGlsZSAoKGludDEyOF9nZXRsbyhhLm1h bnQpICYgKDFVTEwgPDwgTUFOVEJJVFMpKSA9PSAwKSB7IFwKKyAgICAgICAgYSA9IGFjY3VtX25v cm1fbGVmdChhKTsgXAorICAgIH0gXAorICAgIC8qIFwKKyAgICAgKiBPSywgbm93IHdlIG1pZ2h0 IG5lZWQgdG8gZGVub3JtYWxpemUgYmVjYXVzZSBvZiBwb3RlbnRpYWwgdW5kZXJmbG93LiBcCisg ICAgICogV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSByb3VuZGluZywgYW5kIHJvdW5kaW5nIG1p Z2h0IG1ha2UgdXMgbm9ybWFsIFwKKyAgICAgKiBhZ2FpbiBcCisgICAgICovIFwKKyAgICB3aGls ZSAoYS5leHAgPD0gMCkgeyBcCisgICAgICAgIGEgPSBhY2N1bV9ub3JtX3JpZ2h0KGEsIDEgLSBh LmV4cCk7IFwKKyAgICAgICAgLyogXAorICAgICAgICAgKiBEbyB3ZSBoYXZlIHVuZGVyZmxvdz8g XAorICAgICAgICAgKiBUaGF0J3Mgd2hlbiB3ZSBnZXQgYW4gaW5leGFjdCBhbnN3ZXIgYmVjYXVz ZSB3ZSByYW4gb3V0IG9mIGJpdHMgXAorICAgICAgICAgKiBpbiBhIGRlbm9ybWFsLiBcCisgICAg ICAgICAqLyBcCisgICAgICAgIGlmIChhLmd1YXJkIHx8IGEucm91bmQgfHwgYS5zdGlja3kpIHsg XAorICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ191bmRlcmZsb3csIGZwX3N0YXR1 cyk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgLyogT0ssIHdlJ3JlIHJlbGF0aXZlbHkg Y2Fub25pY2FsLi4uIG5vdyB3ZSBuZWVkIHRvIHJvdW5kICovIFwKKyAgICBpZiAoYS5ndWFyZCB8 fCBhLnJvdW5kIHx8IGEuc3RpY2t5KSB7IFwKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxh Z19pbmV4YWN0LCBmcF9zdGF0dXMpOyBcCisgICAgICAgIHN3aXRjaCAoZnBfc3RhdHVzLT5mbG9h dF9yb3VuZGluZ19tb2RlKSB7IFwKKyAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF90b196ZXJvOiBc CisgICAgICAgICAgICAvKiBDaG9wIGFuZCB3ZSdyZSBkb25lICovIFwKKyAgICAgICAgICAgIGJy ZWFrOyBcCisgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfdXA6IFwKKyAgICAgICAgICAgIGlmIChh LnNpZ24gPT0gMCkgeyBcCisgICAgICAgICAgICAgICAgYS5tYW50ID0gaW50MTI4X2FkZChhLm1h bnQsIGludDEyOF9vbmUoKSk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgYnJlYWs7 IFwKKyAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOiBcCisgICAgICAgICAgICBpZiAoYS5z aWduICE9IDApIHsgXAorICAgICAgICAgICAgICAgIGEubWFudCA9IGludDEyOF9hZGQoYS5tYW50 LCBpbnQxMjhfb25lKCkpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGJyZWFrOyBc CisgICAgICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICAgIGlmIChhLnJvdW5kIHx8IGEuc3RpY2t5 KSB7IFwKKyAgICAgICAgICAgICAgICAvKiByb3VuZCB1cCBpZiBndWFyZCBpcyAxLCBkb3duIGlm IGd1YXJkIGlzIHplcm8gKi8gXAorICAgICAgICAgICAgICAgIGEubWFudCA9IGludDEyOF9hZGQo YS5tYW50LCBpbnQxMjhfbWFrZTY0KGEuZ3VhcmQpKTsgXAorICAgICAgICAgICAgfSBlbHNlIGlm IChhLmd1YXJkKSB7IFwKKyAgICAgICAgICAgICAgICAvKiBleGFjdGx5IC41LCByb3VuZCB1cCBp ZiBvZGQgKi8gXAorICAgICAgICAgICAgICAgIGEubWFudCA9IGludDEyOF9hZGQoYS5tYW50LCBp bnQxMjhfYW5kKGEubWFudCwgaW50MTI4X29uZSgpKSk7IFwKKyAgICAgICAgICAgIH0gXAorICAg ICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgLyogXAorICAgICAq IE9LLCBub3cgd2UgbWlnaHQgaGF2ZSBjYXJyaWVkIGFsbCB0aGUgd2F5IHVwLiBcCisgICAgICog U28gd2UgbWlnaHQgbmVlZCB0byBzaHIgb25jZSBcCisgICAgICogYXQgbGVhc3Qgd2Uga25vdyB0 aGF0IHRoZSBsc2Igc2hvdWxkIGJlIHplcm8gaWYgd2Ugcm91bmRlZCBhbmQgXAorICAgICAqIGdv dCBhIGNhcnJ5IG91dC4uLiBcCisgICAgICovIFwKKyAgICBpZiAoKGludDEyOF9nZXRsbyhhLm1h bnQpID4+IChNQU5UQklUUyArIDEpKSAhPSAwKSB7IFwKKyAgICAgICAgYSA9IGFjY3VtX25vcm1f cmlnaHQoYSwgMSk7IFwKKyAgICB9IFwKKyAgICAvKiBPdmVyZmxvdz8gKi8gXAorICAgIGlmIChh LmV4cCA+PSBJTkZfRVhQKSB7IFwKKyAgICAgICAgLyogWWVwLCBpbmYgcmVzdWx0ICovIFwKKyAg ICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19vdmVyZmxvdywgZnBfc3RhdHVzKTsgXAorICAg ICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2luZXhhY3QsIGZwX3N0YXR1cyk7IFwKKyAgICAg ICAgc3dpdGNoIChmcF9zdGF0dXMtPmZsb2F0X3JvdW5kaW5nX21vZGUpIHsgXAorICAgICAgICBj YXNlIGZsb2F0X3JvdW5kX3RvX3plcm86IFwKKyAgICAgICAgICAgIHJldHVybiBtYXhmaW5pdGVf IyNTVUZGSVgoYS5zaWduKTsgXAorICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX3VwOiBcCisgICAg ICAgICAgICBpZiAoYS5zaWduID09IDApIHsgXAorICAgICAgICAgICAgICAgIHJldHVybiBpbmZp bml0ZV8jI1NVRkZJWChhLnNpZ24pOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAg ICAgICAgICAgcmV0dXJuIG1heGZpbml0ZV8jI1NVRkZJWChhLnNpZ24pOyBcCisgICAgICAgICAg ICB9IFwKKyAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOiBcCisgICAgICAgICAgICBpZiAo YS5zaWduICE9IDApIHsgXAorICAgICAgICAgICAgICAgIHJldHVybiBpbmZpbml0ZV8jI1NVRkZJ WChhLnNpZ24pOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgcmV0 dXJuIG1heGZpbml0ZV8jI1NVRkZJWChhLnNpZ24pOyBcCisgICAgICAgICAgICB9IFwKKyAgICAg ICAgZGVmYXVsdDogXAorICAgICAgICAgICAgcmV0dXJuIGluZmluaXRlXyMjU1VGRklYKGEuc2ln bik7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgLyogVW5kZXJmbG93PyAqLyBcCisgICAg aWYgKGludDEyOF9nZXRsbyhhLm1hbnQpICYgKDFVTEwgPDwgTUFOVEJJVFMpKSB7IFwKKyAgICAg ICAgLyogTGVhZGluZyBvbmUgbWVhbnM6IE5vLCB3ZSdyZSBub3JtYWwuIFNvLCB3ZSBzaG91bGQg YmUgZG9uZS4uLiAqLyBcCisgICAgICAgIElOVEVSTkFMX1RZUEUgcmV0OyBcCisgICAgICAgIHJl dC5pID0gMDsgXAorICAgICAgICByZXQuc2lnbiA9IGEuc2lnbjsgXAorICAgICAgICByZXQuZXhw ID0gYS5leHA7IFwKKyAgICAgICAgcmV0Lm1hbnQgPSBpbnQxMjhfZ2V0bG8oYS5tYW50KTsgXAor ICAgICAgICByZXR1cm4gcmV0Lmk7IFwKKyAgICB9IFwKKyAgICBhc3NlcnQoYS5leHAgPT0gMSk7 IFwKKyAgICBJTlRFUk5BTF9UWVBFIHJldDsgXAorICAgIHJldC5pID0gMDsgXAorICAgIHJldC5z aWduID0gYS5zaWduOyBcCisgICAgcmV0LmV4cCA9IDA7IFwKKyAgICByZXQubWFudCA9IGludDEy OF9nZXRsbyhhLm1hbnQpOyBcCisgICAgcmV0dXJuIHJldC5pOyBcCit9CisKK0dFTl9YRl9ST1VO RChmbG9hdDY0LCBERl9NQU5UQklUUywgREZfSU5GX0VYUCwgRG91YmxlKQorR0VOX1hGX1JPVU5E KGZsb2F0MzIsIFNGX01BTlRCSVRTLCBTRl9JTkZfRVhQLCBGbG9hdCkKKworc3RhdGljIGJvb2wg aXNfaW5mX3Byb2QoZmxvYXQ2NCBhLCBmbG9hdDY0IGIpCit7CisgICAgcmV0dXJuICgoZmxvYXQ2 NF9pc19pbmZpbml0eShhKSAmJiBmbG9hdDY0X2lzX2luZmluaXR5KGIpKSB8fAorICAgICAgICAg ICAgKGZsb2F0NjRfaXNfaW5maW5pdHkoYSkgJiYgaXNfZmluaXRlKGIpICYmICghZmxvYXQ2NF9p c196ZXJvKGIpKSkgfHwKKyAgICAgICAgICAgIChmbG9hdDY0X2lzX2luZmluaXR5KGIpICYmIGlz X2Zpbml0ZShhKSAmJiAoIWZsb2F0NjRfaXNfemVybyhhKSkpKTsKK30KKworc3RhdGljIGlubGlu ZSBmbG9hdDY0IHNwZWNpYWxfZm1hKGZsb2F0NjQgYSwgZmxvYXQ2NCBiLCBmbG9hdDY0IGMsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfc3RhdHVzICpmcF9zdGF0dXMp Cit7CisgICAgZmxvYXQ2NCByZXQgPSBtYWtlX2Zsb2F0NjQoMCk7CisKKyAgICAvKgorICAgICAq IElmIEEgbXVsdGlwbGllZCBieSBCIGlzIGFuIGV4YWN0IGluZmluaXR5IGFuZCBDIGlzIGFsc28g YW4gaW5maW5pdHkKKyAgICAgKiBidXQgd2l0aCB0aGUgb3Bwb3NpdGUgc2lnbiwgRk1BIHJldHVy bnMgTmFOIGFuZCByYWlzZXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICB1aW50OF90IGFfc2lnbiA9 IGZsb2F0NjRfaXNfbmVnKGEpOworICAgIHVpbnQ4X3QgYl9zaWduID0gZmxvYXQ2NF9pc19uZWco Yik7CisgICAgdWludDhfdCBjX3NpZ24gPSBmbG9hdDY0X2lzX25lZyhjKTsKKyAgICBpZiAoaXNf aW5mX3Byb2QoYSwgYikgJiYgZmxvYXQ2NF9pc19pbmZpbml0eShjKSkgeworICAgICAgICBpZiAo KGFfc2lnbiBeIGJfc2lnbikgIT0gY19zaWduKSB7CisgICAgICAgICAgICByZXQgPSBtYWtlX2Zs b2F0NjQoREZfTkFOKTsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxp ZCwgZnBfc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9 CisgICAgaWYgKChmbG9hdDY0X2lzX2luZmluaXR5KGEpICYmIGZsb2F0NjRfaXNfemVybyhiKSkg fHwKKyAgICAgICAgKGZsb2F0NjRfaXNfemVybyhhKSAmJiBmbG9hdDY0X2lzX2luZmluaXR5KGIp KSkgeworICAgICAgICByZXQgPSBtYWtlX2Zsb2F0NjQoREZfTkFOKTsKKyAgICAgICAgZmxvYXRf cmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkLCBmcF9zdGF0dXMpOworICAgICAgICByZXR1cm4gcmV0 OworICAgIH0KKyAgICAvKgorICAgICAqIElmIG5vbmUgb2YgdGhlIGFib3ZlIGNoZWNrcyBhcmUg dHJ1ZSBhbmQgQyBpcyBhIE5hTiwKKyAgICAgKiBhIE5hTiBzaGFsbCBiZSByZXR1cm5lZAorICAg ICAqIElmIEEgb3IgQiBhcmUgTmFOLCBhIE5BTiBzaGFsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8K KyAgICBpZiAoZmxvYXQ2NF9pc19hbnlfbmFuKGEpIHx8CisgICAgICAgIGZsb2F0NjRfaXNfYW55 X25hbihiKSB8fAorICAgICAgICBmbG9hdDY0X2lzX2FueV9uYW4oYykpIHsKKyAgICAgICAgaWYg KGZsb2F0NjRfaXNfYW55X25hbihhKSAmJiAoZkdFVEJJVCg1MSwgYSkgPT0gMCkpIHsKKyAgICAg ICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxpZCwgZnBfc3RhdHVzKTsKKyAgICAg ICAgfQorICAgICAgICBpZiAoZmxvYXQ2NF9pc19hbnlfbmFuKGIpICYmIChmR0VUQklUKDUxLCBi KSA9PSAwKSkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkLCBm cF9zdGF0dXMpOworICAgICAgICB9CisgICAgICAgIGlmIChmbG9hdDY0X2lzX2FueV9uYW4oYykg JiYgKGZHRVRCSVQoNTEsIGMpID09IDApKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9h dF9mbGFnX2ludmFsaWQsIGZwX3N0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gbWFr ZV9mbG9hdDY0KERGX05BTik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8qCisg ICAgICogV2UgaGF2ZSBjaGVja2VkIGZvciBhZGRpbmcgb3Bwb3NpdGUtc2lnbmVkIGluZmluaXRp ZXMuCisgICAgICogT3RoZXIgaW5maW5pdGllcyByZXR1cm4gaW5maW5pdHkgd2l0aCB0aGUgY29y cmVjdCBzaWduCisgICAgICovCisgICAgaWYgKGZsb2F0NjRfaXNfaW5maW5pdHkoYykpIHsKKyAg ICAgICAgcmV0ID0gaW5maW5pdGVfZmxvYXQ2NChjX3NpZ24pOworICAgICAgICByZXR1cm4gcmV0 OworICAgIH0KKyAgICBpZiAoZmxvYXQ2NF9pc19pbmZpbml0eShhKSB8fCBmbG9hdDY0X2lzX2lu ZmluaXR5KGIpKSB7CisgICAgICAgIHJldCA9IGluZmluaXRlX2Zsb2F0NjQoYV9zaWduIF4gYl9z aWduKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZ19hc3NlcnRfbm90X3JlYWNo ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdDMyIHNwZWNpYWxfZm1hZihmbG9hdDMyIGEs IGZsb2F0MzIgYiwgZmxvYXQzMiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZmxvYXRfc3RhdHVzICpmcF9zdGF0dXMpCit7CisgICAgZmxvYXQ2NCBhYSwgYmIsIGNjOworICAg IGFhID0gZmxvYXQzMl90b19mbG9hdDY0KGEsIGZwX3N0YXR1cyk7CisgICAgYmIgPSBmbG9hdDMy X3RvX2Zsb2F0NjQoYiwgZnBfc3RhdHVzKTsKKyAgICBjYyA9IGZsb2F0MzJfdG9fZmxvYXQ2NChj LCBmcF9zdGF0dXMpOworICAgIHJldHVybiBmbG9hdDY0X3RvX2Zsb2F0MzIoc3BlY2lhbF9mbWEo YWEsIGJiLCBjYywgZnBfc3RhdHVzKSwgZnBfc3RhdHVzKTsKK30KKworZmxvYXQzMiBpbnRlcm5h bF9mbWFmeChmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxvYXQzMiBjLCBpbnQgc2NhbGUsCisgICAg ICAgICAgICAgICAgICAgICAgIGZsb2F0X3N0YXR1cyAqZnBfc3RhdHVzKQoreworICAgIEFjY3Vt IHByb2Q7CisgICAgQWNjdW0gYWNjOworICAgIEFjY3VtIHJlc3VsdDsKKyAgICBhY2N1bV9pbml0 KCZwcm9kKTsKKyAgICBhY2N1bV9pbml0KCZhY2MpOworICAgIGFjY3VtX2luaXQoJnJlc3VsdCk7 CisKKyAgICB1aW50OF90IGFfc2lnbiA9IGZsb2F0MzJfaXNfbmVnKGEpOworICAgIHVpbnQ4X3Qg Yl9zaWduID0gZmxvYXQzMl9pc19uZWcoYik7CisgICAgdWludDhfdCBjX3NpZ24gPSBmbG9hdDMy X2lzX25lZyhjKTsKKyAgICBpZiAoZmxvYXQzMl9pc19pbmZpbml0eShhKSB8fAorICAgICAgICBm bG9hdDMyX2lzX2luZmluaXR5KGIpIHx8CisgICAgICAgIGZsb2F0MzJfaXNfaW5maW5pdHkoYykp IHsKKyAgICAgICAgcmV0dXJuIHNwZWNpYWxfZm1hZihhLCBiLCBjLCBmcF9zdGF0dXMpOworICAg IH0KKyAgICBpZiAoZmxvYXQzMl9pc19hbnlfbmFuKGEpIHx8CisgICAgICAgIGZsb2F0MzJfaXNf YW55X25hbihiKSB8fAorICAgICAgICBmbG9hdDMyX2lzX2FueV9uYW4oYykpIHsKKyAgICAgICAg cmV0dXJuIHNwZWNpYWxfZm1hZihhLCBiLCBjLCBmcF9zdGF0dXMpOworICAgIH0KKyAgICBpZiAo KHNjYWxlID09IDApICYmIChmbG9hdDMyX2lzX3plcm8oYSkgfHwgZmxvYXQzMl9pc196ZXJvKGIp KSkgeworICAgICAgICBmbG9hdDMyIHRtcCA9IGZsb2F0MzJfbXVsKGEsIGIsIGZwX3N0YXR1cyk7 CisgICAgICAgIHRtcCA9IGZsb2F0MzJfYWRkKHRtcCwgYywgZnBfc3RhdHVzKTsKKyAgICAgICAg cmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICAvKiAoYSAqIDIqKmIpICogKGMgKiAyKipkKSA9PSBh KmMgKiAyKiooYitkKSAqLworICAgIHByb2QubWFudCA9IGludDEyOF9tdWxfNjQ2NChmbG9hdDMy X2dldG1hbnQoYSksIGZsb2F0MzJfZ2V0bWFudChiKSk7CisKKyAgICAvKgorICAgICAqIE5vdGU6 IGV4dHJhY3RpbmcgdGhlIG1hbnRpc3NhIGludG8gYW4gaW50IGlzIG11bHRpcGx5aW5nIGJ5Cisg ICAgICogMioqMjMsIHNvIGFkanVzdCBoZXJlCisgICAgICovCisgICAgcHJvZC5leHAgPSBmbG9h dDMyX2dldGV4cChhKSArIGZsb2F0MzJfZ2V0ZXhwKGIpIC0gU0ZfQklBUyAtIDIzOworICAgIHBy b2Quc2lnbiA9IGFfc2lnbiBeIGJfc2lnbjsKKyAgICBpZiAoZmxvYXQzMl9pc196ZXJvKGEpIHx8 IGZsb2F0MzJfaXNfemVybyhiKSkgeworICAgICAgICBwcm9kLmV4cCA9IC0yICogV0FZX0JJR19F WFA7CisgICAgfQorICAgIGlmICgoc2NhbGUgPiAwKSAmJiBmbG9hdDMyX2lzX2Rlbm9ybWFsKGMp KSB7CisgICAgICAgIGFjYy5tYW50ID0gaW50MTI4X211bF82NDY0KDAsIDApOworICAgICAgICBh Y2MuZXhwID0gLVdBWV9CSUdfRVhQOworICAgICAgICBhY2Muc2lnbiA9IGNfc2lnbjsKKyAgICAg ICAgYWNjLnN0aWNreSA9IDE7CisgICAgICAgIHJlc3VsdCA9IGFjY3VtX2FkZChwcm9kLCBhY2Mp OworICAgIH0gZWxzZSBpZiAoIWZsb2F0MzJfaXNfemVybyhjKSkgeworICAgICAgICBhY2MubWFu dCA9IGludDEyOF9tdWxfNjQ2NChmbG9hdDMyX2dldG1hbnQoYyksIDEpOworICAgICAgICBhY2Mu ZXhwID0gZmxvYXQzMl9nZXRleHAoYyk7CisgICAgICAgIGFjYy5zaWduID0gY19zaWduOworICAg ICAgICByZXN1bHQgPSBhY2N1bV9hZGQocHJvZCwgYWNjKTsKKyAgICB9IGVsc2UgeworICAgICAg ICByZXN1bHQgPSBwcm9kOworICAgIH0KKyAgICByZXN1bHQuZXhwICs9IHNjYWxlOworICAgIHJl dHVybiBhY2N1bV9yb3VuZF9mbG9hdDMyKHJlc3VsdCwgZnBfc3RhdHVzKTsKK30KKworZmxvYXQz MiBpbnRlcm5hbF9tcHlmKGZsb2F0MzIgYSwgZmxvYXQzMiBiLCBmbG9hdF9zdGF0dXMgKmZwX3N0 YXR1cykKK3sKKyAgICBpZiAoZmxvYXQzMl9pc196ZXJvKGEpIHx8IGZsb2F0MzJfaXNfemVybyhi KSkgeworICAgICAgICByZXR1cm4gZmxvYXQzMl9tdWwoYSwgYiwgZnBfc3RhdHVzKTsKKyAgICB9 CisgICAgcmV0dXJuIGludGVybmFsX2ZtYWZ4KGEsIGIsIGZsb2F0MzJfemVybywgMCwgZnBfc3Rh dHVzKTsKK30KKworZmxvYXQ2NCBpbnRlcm5hbF9tcHloaChmbG9hdDY0IGEsIGZsb2F0NjQgYiwK KyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGFjY3VtdWxhdGVk LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3N0YXR1cyAqZnBfc3RhdHVzKQoreworICAg IEFjY3VtIHg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBwcm9kOworICAgIHVuc2lnbmVk IGludCBzdGlja3k7CisgICAgdWludDhfdCBhX3NpZ24sIGJfc2lnbjsKKworICAgIHN0aWNreSA9 IGFjY3VtdWxhdGVkICYgMTsKKyAgICBhY2N1bXVsYXRlZCA+Pj0gMTsKKyAgICBhY2N1bV9pbml0 KCZ4KTsKKyAgICBpZiAoZmxvYXQ2NF9pc196ZXJvKGEpIHx8CisgICAgICAgIGZsb2F0NjRfaXNf YW55X25hbihhKSB8fAorICAgICAgICBmbG9hdDY0X2lzX2luZmluaXR5KGEpKSB7CisgICAgICAg IHJldHVybiBmbG9hdDY0X211bChhLCBiLCBmcF9zdGF0dXMpOworICAgIH0KKyAgICBpZiAoZmxv YXQ2NF9pc196ZXJvKGIpIHx8CisgICAgICAgIGZsb2F0NjRfaXNfYW55X25hbihiKSB8fAorICAg ICAgICBmbG9hdDY0X2lzX2luZmluaXR5KGIpKSB7CisgICAgICAgIHJldHVybiBmbG9hdDY0X211 bChhLCBiLCBmcF9zdGF0dXMpOworICAgIH0KKyAgICB4Lm1hbnQgPSBpbnQxMjhfbXVsXzY0NjQo YWNjdW11bGF0ZWQsIDEpOworICAgIHguc3RpY2t5ID0gc3RpY2t5OworICAgIHByb2QgPSBmR0VU VVdPUkQoMSwgZmxvYXQ2NF9nZXRtYW50KGEpKSAqIGZHRVRVV09SRCgxLCBmbG9hdDY0X2dldG1h bnQoYikpOworICAgIHgubWFudCA9IGludDEyOF9hZGQoeC5tYW50LCBpbnQxMjhfbXVsXzY0NjQo cHJvZCwgMHgxMDAwMDAwMDBVTEwpKTsKKyAgICB4LmV4cCA9IGZsb2F0NjRfZ2V0ZXhwKGEpICsg ZmxvYXQ2NF9nZXRleHAoYikgLSBERl9CSUFTIC0gMjA7CisgICAgaWYgKCFmbG9hdDY0X2lzX25v cm1hbChhKSB8fCAhZmxvYXQ2NF9pc19ub3JtYWwoYikpIHsKKyAgICAgICAgLyogY3J1c2ggdG8g aW5leGFjdCB6ZXJvICovCisgICAgICAgIHguc3RpY2t5ID0gMTsKKyAgICAgICAgeC5leHAgPSAt NDA5NjsKKyAgICB9CisgICAgYV9zaWduID0gZmxvYXQ2NF9pc19uZWcoYSk7CisgICAgYl9zaWdu ID0gZmxvYXQ2NF9pc19uZWcoYik7CisgICAgeC5zaWduID0gYV9zaWduIF4gYl9zaWduOworICAg IHJldHVybiBhY2N1bV9yb3VuZF9mbG9hdDY0KHgsIGZwX3N0YXR1cyk7Cit9Ci0tIAoyLjcuNAoK