From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vs1-xe41.google.com (mail-vs1-xe41.google.com [IPv6:2607:f8b0:4864:20::e41]) by sourceware.org (Postfix) with ESMTPS id 38DA73857C63 for ; Tue, 11 Aug 2020 09:36:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 38DA73857C63 Received: by mail-vs1-xe41.google.com with SMTP id 1so5668752vsl.1 for ; Tue, 11 Aug 2020 02:36:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=+xKltjavE81tNM0qUL4YUkROw/1kh4SbAAAuTBsA6NI=; b=WBneZ1eaFuVP9B3IM6LWh/KbQ4DDpSnzQw9AH5Jj5cVv79Tww9qsNe9jQKZKNk2aYo fGICoItrsBJsvFSLi/UaoFW1HkVZ7MbN+n/9J5I+O98VJGlvlyb1PjHniPWH8HGTH8ik 3brMvLhKe5WxW+91vN4mc0oUc+3YQ0sktjaFYbu3Cdxa/pRpoR8ZJrWT4/HImu6wu5ET cewxoWd/UZbyUt6kPmu5mK8Lb8hASO98zT7bC9H3xKWr3xuMG52p6n1c8o/fu/cx0hWM tWBOGQtC4znIRrg7zFuDdmHmR7drDymmxMK+pcGSQ3KqjicgnyN/xo+wqH+c3KGEGkl1 yzKA== X-Gm-Message-State: AOAM533c77+98il1VHkERafu2fnvA1zbJI7TOl3SGd4fz/7KDBe9FA5H h47v8v0NurjeCncRsdfPim3fCH7hXuCAcIdqXEY= X-Google-Smtp-Source: ABdhPJygL7XBxVFeNIzpvEdS3POtjNbWY2+HPrZyJdWCM5GIVQdmw92kPTgn4nkiMJlJHdBlapU6C2PbXrS5OcV7Mvc= X-Received: by 2002:a67:d516:: with SMTP id l22mr19659170vsj.177.1597138561830; Tue, 11 Aug 2020 02:36:01 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Hongtao Liu Date: Tue, 11 Aug 2020 17:36:24 +0800 Message-ID: Subject: Re: [PATCH] [PR target/96350]Force ENDBR immediate into memory to avoid fake ENDBR opcode. To: Uros Bizjak Cc: GCC Patches , "H. J. Lu" Content-Type: multipart/mixed; boundary="000000000000a2af3105ac96cc93" X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Aug 2020 09:36:05 -0000 --000000000000a2af3105ac96cc93 Content-Type: text/plain; charset="UTF-8" On Tue, Aug 11, 2020 at 4:38 PM Uros Bizjak wrote: > > On Tue, Aug 11, 2020 at 5:30 AM Hongtao Liu wrote: > > > > Hi: > > The issue is described in the bugzilla. > > Bootstrap is ok, regression test for i386/x86-64 backend is ok. > > Ok for trunk? > > > > ChangeLog > > gcc/ > > PR target/96350 > > * config/i386/i386.c (ix86_legitimate_constant_p): Return > > false for ENDBR immediate. > > (ix86_legitimate_address_p): Ditto. > > * config/i386/predicated.md > > (x86_64_immediate_operand): Exclude ENDBR immediate. > > (x86_64_zext_immediate_operand): Ditto. > > (x86_64_dwzext_immediate_operand): Ditto. > > (ix86_not_endbr_immediate_operand): New predicate. > > > > gcc/testsuite > > * gcc.target/i386/endbr_immediate.c: New test. > > +;; Return true if VALUE isn't an ENDBR opcode in immediate field. > +(define_predicate "ix86_not_endbr_immediate_operand" > + (match_test "1") > > Please reverse the above logic to introduce > ix86_endbr_immediate_operand, that returns true for unwanted > immediate. Something like: > > (define_predicate "ix86_endbr_immediate_operand" > (match_code "const_int") > ... > > And you will be able to use it like: > > if (ix86_endbr_immediate_operand (x, VOIDmode) > return false; > Changed. > /* Otherwise we handle everything else in the move patterns. */ > - return true; > + return ix86_not_endbr_immediate_operand (x, VOIDmode); > } > > Please handle this in CASE_CONST_SCALAR_INT: part. > > + if (disp && !ix86_not_endbr_immediate_operand (disp, VOIDmode)) > + return false; > > And this in: > > /* Validate displacement. */ > if (disp) > { > Changed. > Uros. > > > -- > > BR, > > Hongtao Update patch. -- BR, Hongtao --000000000000a2af3105ac96cc93 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Force-ENDBR-immediate-into-memory_v2.patch" Content-Disposition: attachment; filename="0001-Force-ENDBR-immediate-into-memory_v2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kdpr1ked0 RnJvbSBlYjk0M2E1YmYwNjBmMGQ5MTI5NzliY2U3NmI0ZjBjMGNiYWVkODU4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBUdWUsIDQgQXVnIDIwMjAgMTA6MDA6MTMgKzA4MDAKU3ViamVjdDogW1BBVENIXSBGb3JjZSBF TkRCUiBpbW1lZGlhdGUgaW50byBtZW1vcnkuCgpnY2MvCglQUiB0YXJnZXQvOTYzNTAKCSogY29u ZmlnL2kzODYvaTM4Ni5jIChpeDg2X2xlZ2l0aW1hdGVfY29uc3RhbnRfcCk6IFJldHVybgoJZmFs c2UgZm9yIEVOREJSIGltbWVkaWF0ZS4KCShpeDg2X2xlZ2l0aW1hdGVfYWRkcmVzc19wKTogRGl0 dG8uCgkqIGNvbmZpZy9pMzg2L3ByZWRpY2F0ZWQubWQKCSh4ODZfNjRfaW1tZWRpYXRlX29wZXJh bmQpOiBFeGNsdWRlIEVOREJSIGltbWVkaWF0ZS4KCSh4ODZfNjRfemV4dF9pbW1lZGlhdGVfb3Bl cmFuZCk6IERpdHRvLgoJKHg4Nl82NF9kd3pleHRfaW1tZWRpYXRlX29wZXJhbmQpOiBEaXR0by4K CShpeDg2X2VuZGJyX2ltbWVkaWF0ZV9vcGVyYW5kKTogTmV3IHByZWRpY2F0ZS4KCmdjYy90ZXN0 c3VpdGUKCSogZ2NjLnRhcmdldC9pMzg2L2VuZGJyX2ltbWVkaWF0ZS5jOiBOZXcgdGVzdC4KLS0t CiBnY2MvY29uZmlnL2kzODYvaTM4Ni5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQgKwog Z2NjL2NvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQgICAgICAgICAgICAgICAgIHwgIDMyICsrKwog Li4uL2djYy50YXJnZXQvaTM4Ni9lbmRicl9pbW1lZGlhdGUuYyAgICAgICAgIHwgMTk4ICsrKysr KysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAyMzQgaW5zZXJ0aW9ucygrKQogY3JlYXRl IG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2VuZGJyX2ltbWVkaWF0 ZS5jCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYuYyBiL2djYy9jb25maWcvaTM4 Ni9pMzg2LmMKaW5kZXggOGVhNmE0ZDdlYTcuLjM4ODI5MWYxZGJhIDEwMDY0NAotLS0gYS9nY2Mv Y29uZmlnL2kzODYvaTM4Ni5jCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmMKQEAgLTEwMDY5 LDYgKzEwMDY5LDggQEAgaXg4Nl9sZWdpdGltYXRlX2NvbnN0YW50X3AgKG1hY2hpbmVfbW9kZSBt b2RlLCBydHggeCkKIAlkZWZhdWx0OgogCSAgYnJlYWs7CiAJfQorICAgICAgaWYgKGl4ODZfZW5k YnJfaW1tZWRpYXRlX29wZXJhbmQgKHgsIFZPSURtb2RlKSkKKwlyZXR1cm4gZmFsc2U7CiAgICAg ICBicmVhazsKIAogICAgIGNhc2UgQ09OU1RfVkVDVE9SOgpAQCAtMTA1NjYsNiArMTA1NjgsOCBA QCBpeDg2X2xlZ2l0aW1hdGVfYWRkcmVzc19wIChtYWNoaW5lX21vZGUsIHJ0eCBhZGRyLCBib29s IHN0cmljdCkKIAkgICAgICAgJiYgQ09OU1RfSU5UX1AgKGRpc3ApCiAJICAgICAgICYmIHZhbF9z aWduYml0X2tub3duX3NldF9wIChTSW1vZGUsIElOVFZBTCAoZGlzcCkpKQogCXJldHVybiBmYWxz ZTsKKyAgICAgIGlmIChpeDg2X2VuZGJyX2ltbWVkaWF0ZV9vcGVyYW5kIChkaXNwLCBWT0lEbW9k ZSkpCisJcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAvKiBFdmVyeXRoaW5nIGxvb2tzIHZhbGlk LiAgKi8KZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9wcmVkaWNhdGVzLm1kIGIvZ2NjL2Nv bmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQKaW5kZXggMDdlNjlkNTU1YzAuLjQ3YWIwNTNkYzk5IDEw MDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZAorKysgYi9nY2MvY29uZmln L2kzODYvcHJlZGljYXRlcy5tZApAQCAtMTMwLDEwICsxMzAsMzcgQEAKIChkZWZpbmVfcHJlZGlj YXRlICJzeW1ib2xfb3BlcmFuZCIKICAgKG1hdGNoX2NvZGUgInN5bWJvbF9yZWYiKSkKIAorOzsg UmV0dXJuIHRydWUgaWYgVkFMVUUgaXNuJ3QgYW4gRU5EQlIgb3Bjb2RlIGluIGltbWVkaWF0ZSBm aWVsZC4KKyhkZWZpbmVfcHJlZGljYXRlICJpeDg2X2VuZGJyX2ltbWVkaWF0ZV9vcGVyYW5kIgor ICAobWF0Y2hfY29kZSAiY29uc3RfaW50IikKK3sKKyAgaWYgKChmbGFnX2NmX3Byb3RlY3Rpb24g JiBDRl9CUkFOQ0gpCisgICAgICAmJiBDT05TVF9JTlRfUCAob3ApKQorICAgICB7CisgICAgICAg dW5zaWduZWQgSE9TVF9XSURFX0lOVCBpbW0gPSBJTlRWQUwgKG9wKTsKKyAgICAgICBpZiAoIVRB UkdFVF82NEJJVCB8fCBpbW0gPD0gMHhmZmZmZmZmZikKKwkgcmV0dXJuIGltbSA9PSAoVEFSR0VU XzY0QklUID8gMHhmYTFlMGZmMyA6IDB4ZmIxZTBmZjMpOworCisgICAgICAgLyogTkI6IEVuY29k aW5nIGlzIGJ5dGUgYmFzZWQuICAqLworICAgICAgIGRvCisJIHsKKwkgIGlmICgoMHhmZmZmZmZm ZiAmIGltbSkgPT0gMHhmYTFlMGZmMykKKwkgICAgcmV0dXJuIHRydWU7CisJICBpbW0gPj49IDg7 CisJIH0KKyAgICAgICB3aGlsZSAoaW1tID4gMHhmZmZmZmZmZik7CisgICAgIH0KKworICByZXR1 cm4gZmFsc2U7Cit9KQorCiA7OyBSZXR1cm4gdHJ1ZSBpZiBWQUxVRSBjYW4gYmUgc3RvcmVkIGlu IGEgc2lnbiBleHRlbmRlZCBpbW1lZGlhdGUgZmllbGQuCiAoZGVmaW5lX3ByZWRpY2F0ZSAieDg2 XzY0X2ltbWVkaWF0ZV9vcGVyYW5kIgogICAobWF0Y2hfY29kZSAiY29uc3RfaW50LHN5bWJvbF9y ZWYsbGFiZWxfcmVmLGNvbnN0IikKIHsKKyAgaWYgKGl4ODZfZW5kYnJfaW1tZWRpYXRlX29wZXJh bmQgKG9wLCBWT0lEbW9kZSkpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIGlmICghVEFSR0VUXzY0 QklUKQogICAgIHJldHVybiBpbW1lZGlhdGVfb3BlcmFuZCAob3AsIG1vZGUpOwogCkBAIC0yNjAs NiArMjg3LDkgQEAKIChkZWZpbmVfcHJlZGljYXRlICJ4ODZfNjRfemV4dF9pbW1lZGlhdGVfb3Bl cmFuZCIKICAgKG1hdGNoX2NvZGUgImNvbnN0X2ludCxzeW1ib2xfcmVmLGxhYmVsX3JlZixjb25z dCIpCiB7CisgIGlmIChpeDg2X2VuZGJyX2ltbWVkaWF0ZV9vcGVyYW5kIChvcCwgVk9JRG1vZGUp KQorICAgIHJldHVybiBmYWxzZTsKKwogICBzd2l0Y2ggKEdFVF9DT0RFIChvcCkpCiAgICAgewog ICAgIGNhc2UgQ09OU1RfSU5UOgpAQCAtMzc0LDYgKzQwNCw4IEBACiAoZGVmaW5lX3ByZWRpY2F0 ZSAieDg2XzY0X2R3emV4dF9pbW1lZGlhdGVfb3BlcmFuZCIKICAgKG1hdGNoX2NvZGUgImNvbnN0 X2ludCxjb25zdF93aWRlX2ludCIpCiB7CisgIGlmIChpeDg2X2VuZGJyX2ltbWVkaWF0ZV9vcGVy YW5kIChvcCwgVk9JRG1vZGUpKQorICAgIHJldHVybiBmYWxzZTsKICAgc3dpdGNoIChHRVRfQ09E RSAob3ApKQogICAgIHsKICAgICBjYXNlIENPTlNUX0lOVDoKZGlmZiAtLWdpdCBhL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2VuZGJyX2ltbWVkaWF0ZS5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvZW5kYnJfaW1tZWRpYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLjMwMTU1MTJhYTBlCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2kzODYvZW5kYnJfaW1tZWRpYXRlLmMKQEAgLTAsMCArMSwxOTggQEAK Ky8qIFBSIHRhcmdldC85NjM1MCAqLworLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGct b3B0aW9ucyAiLWZjZi1wcm90ZWN0aW9uIC1PMiIgfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLW5vdCAiJC04MTkxNTkxNyIgeyB0YXJnZXQgeyBpYTMyIH0gfSB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIiQtOTg2OTMxMzMiIHsgdGFyZ2V0IHsg ISBpYTMyIH0gfSB9IH0gKgorLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiJC00 MjM4ODM3Nzg1NzQ3NzgzNjgiIHsgdGFyZ2V0IHsgISBpYTMyIH0gfSB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlciAiXFsgXHRcXSotODE5MTU5MTciIHsgdGFyZ2V0IHsgaWEz MiB9IH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIgIlxbIFx0XF0qLTk4 NjkzMTMzIiB7IHRhcmdldCB7ICEgaWEzMiB9IH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXIgIlxbIFx0XF0qLTQyMzg4Mzc3ODU3NDc3ODM2OCIgeyB0YXJnZXQgeyAhIGlh MzIgfSB9IH0gfSAqLworCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIEVOREJSX0lNTUVE SUFURSAweGZhMWUwZmYzCisjZGVmaW5lIEVYVEVORF9FTkRCUl9JTU1FRElBVEUgMHhmYTFlMGZm MzAwMDAwMDAwCisjZWxzZQorI2RlZmluZSBFTkRCUl9JTU1FRElBVEUgMHhmYjFlMGZmMworI2Rl ZmluZSBFWFRFTkRfRU5EQlJfSU1NRURJQVRFIDB4ZmZmYjFlMGZmMzAwCisjZW5kaWYKKworaW50 Citmb28gKGludCBhKQoreworICByZXR1cm4gYSArIEVOREJSX0lNTUVESUFURTsKK30KKworaW50 Citmb28yIChpbnQgYSkKK3sKKyAgcmV0dXJuIGEgLSBFTkRCUl9JTU1FRElBVEU7Cit9CisKK2lu dAorZm9vMyAoaW50IGEpCit7CisgIHJldHVybiBhICogRU5EQlJfSU1NRURJQVRFOworfQorCitp bnQKK2ZvbzQgKGludCBhKQoreworICByZXR1cm4gYSB8IEVOREJSX0lNTUVESUFURTsKK30KKwor aW50Citmb281IChpbnQgYSkKK3sKKyAgcmV0dXJuIGEgXiBFTkRCUl9JTU1FRElBVEU7Cit9CisK K2ludAorZm9vNiAoaW50IGEpCit7CisgIHJldHVybiBhICYgRU5EQlJfSU1NRURJQVRFOworfQor CitpbnQKK2ZvbzcgKGludCBhKQoreworICByZXR1cm4gYSA+IEVOREJSX0lNTUVESUFURTsKK30K KworaW50Citmb284IChpbnQgYSkKK3sKKyAgcmV0dXJuIEVOREJSX0lNTUVESUFURTsKK30KKwor aW50Citmb285IChpbnQqIHApCit7CisgIHJldHVybiAqKHAgKyBFTkRCUl9JTU1FRElBVEUpOwor fQorCitpbnQKK2ZvbzEwIChpbnQqIHApCit7CisgIHJldHVybiAqKGludCopIEVOREJSX0lNTUVE SUFURTsKK30KKworbG9uZyBsb25nCitmb28xMSAobG9uZyBsb25nIGEpCit7CisgIHJldHVybiBh ICsgRVhURU5EX0VOREJSX0lNTUVESUFURTsKK30KKworbG9uZyBsb25nCitmb28xMiAobG9uZyBs b25nIGEpCit7CisgIHJldHVybiBhIC0gRVhURU5EX0VOREJSX0lNTUVESUFURTsKK30KKworbG9u ZyBsb25nCitmb28xMyAobG9uZyBsb25nIGEpCit7CisgIHJldHVybiBhICogRVhURU5EX0VOREJS X0lNTUVESUFURTsKK30KKworbG9uZyBsb25nCitmb28xNCAobG9uZyBsb25nIGEpCit7CisgIHJl dHVybiBhIHwgRVhURU5EX0VOREJSX0lNTUVESUFURTsKK30KKworbG9uZyBsb25nCitmb28xNSAo bG9uZyBsb25nIGEpCit7CisgIHJldHVybiBhIF4gRVhURU5EX0VOREJSX0lNTUVESUFURTsKK30K KworbG9uZyBsb25nCitmb28xNiAobG9uZyBsb25nIGEpCit7CisgIHJldHVybiBhICYgRVhURU5E X0VOREJSX0lNTUVESUFURTsKK30KKworbG9uZyBsb25nCitmb28xNyAobG9uZyBsb25nIGEpCit7 CisgIHJldHVybiBhID4gRVhURU5EX0VOREJSX0lNTUVESUFURTsKK30KKworbG9uZyBsb25nCitm b28xOCAobG9uZyBsb25nIGEpCit7CisgIHJldHVybiBFWFRFTkRfRU5EQlJfSU1NRURJQVRFOwor fQorCitsb25nIGxvbmcKK2ZvbzE5IChsb25nIGxvbmcqIHApCit7CisgIHJldHVybiAqKHAgKyBF WFRFTkRfRU5EQlJfSU1NRURJQVRFKTsKK30KKworbG9uZyBsb25nCitmb28yMCAobG9uZyBsb25n KiBwKQoreworICByZXR1cm4gKihsb25nIGxvbmcqKSBFWFRFTkRfRU5EQlJfSU1NRURJQVRFOwor fQorCitsb25nIGxvbmcKK2ZvbzIxIChpbnQgYSkKK3sKKyAgcmV0dXJuIGEgKyBFTkRCUl9JTU1F RElBVEU7Cit9CisKK2xvbmcgbG9uZworZm9vMjIgKGludCBhKQoreworICByZXR1cm4gYSAtIEVO REJSX0lNTUVESUFURTsKK30KKworbG9uZyBsb25nCitmb28yMyAobG9uZyBsb25nIGEpCit7Cisg IHJldHVybiBhICogRU5EQlJfSU1NRURJQVRFOworfQorCitsb25nIGxvbmcKK2ZvbzI0IChpbnQg YSkKK3sKKyAgcmV0dXJuIGEgfCBFTkRCUl9JTU1FRElBVEU7Cit9CisKK2xvbmcgbG9uZworZm9v MjUgKGludCBhKQoreworICByZXR1cm4gYSBeIEVOREJSX0lNTUVESUFURTsKK30KKworbG9uZyBs b25nCitmb28yNiAoaW50IGEpCit7CisgIHJldHVybiBhICYgRU5EQlJfSU1NRURJQVRFOworfQor Citsb25nIGxvbmcKK2ZvbzI3IChpbnQgYSkKK3sKKyAgcmV0dXJuIGEgPiBFTkRCUl9JTU1FRElB VEU7Cit9CisKK2xvbmcgbG9uZworZm9vMjggKGludCBhKQoreworICByZXR1cm4gRU5EQlJfSU1N RURJQVRFOworfQorCitsb25nIGxvbmcKK2ZvbzI5IChpbnQqIHApCit7CisgIHJldHVybiAqKHAg KyBFTkRCUl9JTU1FRElBVEUpOworfQorCitsb25nIGxvbmcKK2ZvbzMwIChpbnQqIHApCit7Cisg IHJldHVybiAqKGxvbmcgbG9uZyopIEVOREJSX0lNTUVESUFURTsKK30KLS0gCjIuMTguMQoK --000000000000a2af3105ac96cc93--