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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id C611AC433F5 for ; Tue, 19 Apr 2022 14:42:08 +0000 (UTC) Received: from localhost ([::1]:47044 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ngp3P-0002tC-F0 for qemu-devel@archiver.kernel.org; Tue, 19 Apr 2022 10:42:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57910) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ngp0j-0001cU-16; Tue, 19 Apr 2022 10:39:21 -0400 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]:35664) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1ngp0g-0005aV-3F; Tue, 19 Apr 2022 10:39:20 -0400 Received: by mail-wr1-x434.google.com with SMTP id k22so22740314wrd.2; Tue, 19 Apr 2022 07:39:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:message-id:date:mime-version:user-agent:content-language:to :from:subject; bh=PiR1cC24lZgiao3+jDrJDr8/TIE+q6C/jNzNAw8CYdU=; b=K1UC2Yt8bDxA3XzT8LcqB929Rdk9gJCNKGybDhEuXEDASkz5GiAw6A5RURGhJHn3IJ +0ZGEFonlI4fF/xOfa1w8O+qGuQQCgea/ggqGBHEszxW9Yt028/m/psdEgwgXrD1+uTC BpoXBwfhOktHb9gO0DqihboZvfru38U+6fbac6JaeuWAWEsKeA1WSyHFWGCpPVOtIJsE m4erxZH1vYDdx618TfkpKMTmPRmiCcEMwCrgun8xecO5h5n6mJKh17rmPnqF9LAZjOCj sSdhFQdOqd9KZEaDC44m7IYyA8SBEMhr3bbjYwPd3kHM2t6dRBIjhCliQ42hv16Yw2Wn DWHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:message-id:date:mime-version:user-agent :content-language:to:from:subject; bh=PiR1cC24lZgiao3+jDrJDr8/TIE+q6C/jNzNAw8CYdU=; b=WWsHnW6e1NCjfoTb86tAKw7t/BP3Sk46ayuqdyoE2B1SJs5PYpLBtRPddu8KjYn8pR OLcJUR2vXrXDl6CptmzhdSehKILW4qeIC50jXwvJL2ZE5VMNe1fwBwE0R0uU1KyMAq1x +0EiFRp7Hkz4rXlxJLZMPFpbE7v6Rb6NVhA9W1trypS2jZN7+dUq8tlUWfvPejIQhLdq SulluU+9OQy6RKoJFlLpa11BkjlQI5LvGUQwZqZpp14xIAKp5H/sQaocqAJ9hzE+caoU ObjXUAkDkMwVxDWrq94Kxi0pGToOyonU6CRpIr6UhS8HJt0uz4ediy21CUlGNW+aHBQ1 7iKA== X-Gm-Message-State: AOAM531Vlh1aV00Vek/DKbINSJgUrFgjwloCGw0Da1IJzTXsHD9M+PQN FpK/B60VETUkJdYD0QQmaxg= X-Google-Smtp-Source: ABdhPJwj6eI/ynycCtQB3iU9LS03B8LG71unad+k86NsxoxpwnHBIDNthhm+3aAMFpzHiCdjBdkIRw== X-Received: by 2002:adf:d1e2:0:b0:20a:91fa:822 with SMTP id g2-20020adfd1e2000000b0020a91fa0822mr9007604wrd.349.1650379155997; Tue, 19 Apr 2022 07:39:15 -0700 (PDT) Received: from ?IPV6:2001:b07:6468:f312:c8dd:75d4:99ab:290a? ([2001:b07:6468:f312:c8dd:75d4:99ab:290a]) by smtp.googlemail.com with ESMTPSA id i127-20020a1c3b85000000b00391a363f5adsm13012927wma.36.2022.04.19.07.39.14 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 19 Apr 2022 07:39:15 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------PKYQK0aqtVW5NTVXIoA9Qgbu" Message-ID: Date: Tue, 19 Apr 2022 16:39:13 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Content-Language: en-US To: Kevin Wolf , Stefan Hajnoczi , Emanuele Giuseppe Esposito , Hanna Reitz , John Snow , qemu-devel , qemu block From: Paolo Bonzini Subject: introducing vrc :) Received-SPF: pass client-ip=2a00:1450:4864:20::434; envelope-from=paolo.bonzini@gmail.com; helo=mail-wr1-x434.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FILL_THIS_FORM=0.001, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_FILL_THIS_FORM_FRAUD_PHISH=0.01, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" This is a multi-part message in MIME format. --------------PKYQK0aqtVW5NTVXIoA9Qgbu Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi all, a while ago I looked at tools that could be used too build a call graph. The simplest but most effective that I found was a small Perl program (called "egypt", which is rot13 for "rtlcg" aka RTL call graph) that used the GCC dumps to build the graph. I have now rewritten it in Python and extended it with a lot of new functionality: - consult compile_commands.json to find/build dumps automatically - virtual (manually created) nodes and edges - query call graph in addition to generating DOT file - interactive mode with readline + completion The name is unfortunately not rot13 anymore, it stands for visit RTL callgraph. Here is an example (run vrc from the root build directory of QEMU): # load files load libblock.fa.p/*.c.o # introduce virtual edges corresponding to function pointers node BlockDriverState.bdrv_co_flush edge bdrv_co_flush BlockDriverState.bdrv_co_flush edge BlockDriverState.bdrv_co_flush blk_log_writes_co_do_file_flush edge BlockDriverState.bdrv_co_flush preallocate_co_flush edge BlockDriverState.bdrv_co_flush raw_co_invalidate_cache edge BlockDriverState.bdrv_co_flush cbw_co_flush edge BlockDriverState.bdrv_co_flush quorum_co_flush edge BlockDriverState.bdrv_co_flush throttle_co_flush edge BlockDriverState.bdrv_co_flush blkdebug_co_flush edge BlockDriverState.bdrv_co_flush blkverify_co_flush edge BlockDriverState.bdrv_co_flush bdrv_mirror_top_flush # apply filter only --callees bdrv_co_flush # draw graph dotty --files The filtering functionality is a bit rough in the presence of mutual recursion, but hopefully this can be already useful to find the root calls of bdrv_*, which are the places where the graph lock has to be taken for read. Continuing the previous example: # apply another filter reset omit --callees bdrv_co_flush keep bdrv_co_flush # example of query callers bdrv_co_flush already gives a reasonable answer (not entirely correct, but the actual analysis must be done on all callbacks at once): qed_co_request -> bdrv_co_flush qed_need_check_timer_entry -> bdrv_co_flush blk_log_writes_co_log -> bdrv_co_flush bdrv_co_flush_entry -> bdrv_co_flush bdrv_co_flush -> bdrv_co_flush blk_co_do_flush -> bdrv_co_flush bdrv_driver_pwritev -> bdrv_co_flush blk_co_flush -> bdrv_co_flush bdrv_flush -> bdrv_co_flush bdrv_co_do_pwrite_zeroes -> bdrv_co_flush blk_aio_flush_entry -> bdrv_co_flush Paolo --------------PKYQK0aqtVW5NTVXIoA9Qgbu Content-Type: text/plain; charset=UTF-8; name="vrc" Content-Disposition: attachment; filename="vrc" Content-Transfer-Encoding: base64 IyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKaW1wb3J0IGFyZ3BhcnNlCmZyb20gY29sbGVjdGlv bnMgaW1wb3J0IGRlZmF1bHRkaWN0CmltcG9ydCBkYXRhY2xhc3NlcwppbXBvcnQgZ2xvYgpp bXBvcnQgaW8KaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgcmVhZGxp bmUKaW1wb3J0IHNobGV4CmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMKaW1wb3J0IHR5 cGluZwoKCkBkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKY2xhc3MgTm9kZToKICAgIG5hbWU6IHN0 cgogICAgY2FsbGVyczogc2V0W3N0cl0KICAgIGNhbGxlZXM6IGRpY3Rbc3RyLCBzdHJdCiAg ICB1c2VybmFtZTogdHlwaW5nLk9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBleHRlcm5hbDog Ym9vbCA9IFRydWUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3Vw ZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYu Y2FsbGVycyA9IHNldCgpCiAgICAgICAgc2VsZi5jYWxsZWVzID0gZGljdCgpCgogICAgZGVm IF9fZ2V0aXRlbV9fKHNlbGYsIGNhbGxlZTogc3RyKSAtPiBzdHI6CiAgICAgICAgcmV0dXJu IHNlbGYuY2FsbGVlc1tjYWxsZWVdCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGNhbGxl ZTogc3RyLCB0eXBlOiBzdHIpOgogICAgICAgICMgQSAicmVmIiBlZGdlIGRvZXMgbm90IG92 ZXJyaWRlIGEgImNhbGwiIGVkZ2UKICAgICAgICBpZiB0eXBlID09ICJjYWxsIiBvciBjYWxs ZWUgbm90IGluIHNlbGYuY2FsbGVlczoKICAgICAgICAgICAgc2VsZi5jYWxsZWVzW2NhbGxl ZV0gPSB0eXBlCgoKY2xhc3MgR3JhcGg6CiAgICBub2RlczogZGljdFtzdHIsIE5vZGVdCiAg ICBub2Rlc19ieV91c2VybmFtZTogZGljdFtzdHIsIE5vZGVdCiAgICBmaWxlczogZGljdFtz dHIsIGxpc3Rbc3RyXV0KICAgIGtlZXA6IHR5cGluZy5PcHRpb25hbFtzZXRbc3RyXV0KICAg IG9taXQ6IHNldFtzdHJdCiAgICBmaWx0ZXJfZGVmYXVsdDogYm9vbAoKICAgIGRlZiBfX2lu aXRfXyhzZWxmKToKICAgICAgICBzZWxmLm5vZGVzID0ge30KICAgICAgICBzZWxmLm5vZGVz X2J5X3VzZXJuYW1lID0ge30KICAgICAgICBzZWxmLmZpbGVzID0gZGVmYXVsdGRpY3QobGFt YmRhOiBsaXN0KCkpCgogICAgICAgIHNlbGYucmVzZXRfZmlsdGVyKCkKCiAgICBkZWYgcGFy c2Uoc2VsZiwgZm46IHN0ciwgbGluZXM6IHR5cGluZy5JdGVyYXRvcltzdHJdLCB2ZXJib3Nl X3ByaW50KSAtPiBOb25lOgogICAgICAgIFJFX0ZVTkMxID0gcmUuY29tcGlsZShyIl47OyBG dW5jdGlvbiAoXFMrKVxzKiQiKQogICAgICAgIFJFX0ZVTkMyID0gcmUuY29tcGlsZShyIl47 OyBGdW5jdGlvbiAoLiopXHMrXCgoXFMrKSgsLiopP1wpLiokIikKICAgICAgICBSRV9TWU1C T0xfUkVGID0gcmUuY29tcGlsZShyJ1woc3ltYm9sX3JlZiBbXihdKiBcKCAiKFteIl0qKSIn LCBmbGFncz1yZS5YKQogICAgICAgIGN1cmZ1bmMgPSBOb25lCiAgICAgICAgZm9yIGxpbmUg aW4gbGluZXM6CiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiOzsgRnVuY3Rpb24g Iik6CiAgICAgICAgICAgICAgICBtID0gUkVfRlVOQzEuc2VhcmNoKGxpbmUpCiAgICAgICAg ICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIGN1cmZ1bmMgPSBtLmdyb3VwKDEp CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbm9kZShtLmdyb3VwKDEpLCBmaWxlPWZu KQogICAgICAgICAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoZiJ7Zm59OiBmb3VuZCBmdW5j dGlvbiB7bS5ncm91cCgxKX0iKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAg ICAgICAgICAgICBtID0gUkVfRlVOQzIuc2VhcmNoKGxpbmUpCiAgICAgICAgICAgICAgICBp ZiBtOgogICAgICAgICAgICAgICAgICAgIGN1cmZ1bmMgPSBtLmdyb3VwKDIpCiAgICAgICAg ICAgICAgICAgICAgc2VsZi5hZGRfbm9kZShtLmdyb3VwKDIpLCB1c2VybmFtZT1tLmdyb3Vw KDEpLCBmaWxlPWZuKQogICAgICAgICAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoZiJ7Zm59 OiBmb3VuZCBmdW5jdGlvbiB7bS5ncm91cCgxKX0gKHttLmdyb3VwKDIpfSkiKQogICAgICAg ICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgY3VyZnVuYzoKICAgICAg ICAgICAgICAgIG0gPSBSRV9TWU1CT0xfUkVGLnNlYXJjaChsaW5lKQogICAgICAgICAgICAg ICAgaWYgbToKICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhbGwiIGlmICIoY2FsbCIg aW4gbGluZSBlbHNlICJyZWYiCiAgICAgICAgICAgICAgICAgICAgdmVyYm9zZV9wcmludChm Intmbn06IGZvdW5kIHt0eXBlfSBlZGdlIHtjdXJmdW5jfSAtPiB7bS5ncm91cCgxKX0iKQog ICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX2VkZ2UoY3VyZnVuYywgbS5ncm91cCgxKSwg dHlwZSkKCiAgICBkZWYgYWRkX2V4dGVybmFsX25vZGUoc2VsZiwgbmFtZTogc3RyKSAtPiBO b25lOgogICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYubm9kZXM6CiAgICAgICAgICAgIHNl bGYubm9kZXNbbmFtZV0gPSBOb2RlKG5hbWU9bmFtZSkKCiAgICBkZWYgYWRkX25vZGUoc2Vs ZiwgbmFtZTogc3RyLCB1c2VybmFtZTogdHlwaW5nLk9wdGlvbmFsW3N0cl0gPSBOb25lLAog ICAgICAgICAgICAgICAgIGZpbGU6IHR5cGluZy5PcHRpb25hbFtzdHJdID0gTm9uZSkgLT4g Tm9uZToKICAgICAgICBzZWxmLmFkZF9leHRlcm5hbF9ub2RlKG5hbWUpCiAgICAgICAgaWYg c2VsZi5ub2Rlc1tuYW1lXS5leHRlcm5hbDoKICAgICAgICAgICAgIyBUaGlzIGlzIG5vdyBh IGRlZmluZWQgbm9kZS4gIEl0IG1pZ2h0IGhhdmUgYSB1c2VybmFtZSBhbmQgYSBmaWxlCiAg ICAgICAgICAgIHNlbGYubm9kZXNbbmFtZV0uZXh0ZXJuYWwgPSBGYWxzZQogICAgICAgICAg ICBpZiB1c2VybmFtZToKICAgICAgICAgICAgICAgIHNlbGYubm9kZXNbbmFtZV0udXNlcm5h bWUgPSB1c2VybmFtZQogICAgICAgICAgICAgICAgc2VsZi5ub2Rlc19ieV91c2VybmFtZVt1 c2VybmFtZV0gPSBzZWxmLm5vZGVzW25hbWVdCiAgICAgICAgICAgIGlmIGZpbGU6CiAgICAg ICAgICAgICAgICBzZWxmLmZpbGVzW2ZpbGVdLmFwcGVuZChuYW1lKQoKICAgIGRlZiBhZGRf ZWRnZShzZWxmLCBjYWxsZXI6IHN0ciwgY2FsbGVlOiBzdHIsIHR5cGU6IHN0cikgLT4gTm9u ZToKICAgICAgICAjIFRoZSBjYWxsZXIgbXVzdCBleGlzdCwgYnV0IHRoZSBjYWxsZWUgY291 bGQgYmUgZXh0ZXJuYWwuCiAgICAgICAgc2VsZi5hZGRfZXh0ZXJuYWxfbm9kZShjYWxsZWUp CiAgICAgICAgc2VsZi5ub2Rlc1tjYWxsZXJdW2NhbGxlZV0gPSB0eXBlCiAgICAgICAgc2Vs Zi5ub2Rlc1tjYWxsZWVdLmNhbGxlcnMuYWRkKGNhbGxlcikKCiAgICBkZWYgX2dldF9ub2Rl KHNlbGYsIG5hbWU6IHN0cikgLT4gdHlwaW5nLk9wdGlvbmFsW05vZGVdOgogICAgICAgIGlm IG5hbWUgaW4gc2VsZi5ub2Rlc19ieV91c2VybmFtZToKICAgICAgICAgICAgcmV0dXJuIHNl bGYubm9kZXNfYnlfdXNlcm5hbWVbbmFtZV0KICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi5u b2RlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYubm9kZXNbbmFtZV0KICAgICAgICBlbHNl OgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBoYXNfbm9kZShzZWxmLCBuYW1l OiBzdHIpIC0+IGJvb2w6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fZ2V0X25vZGUobmFt ZSkpCgogICAgZGVmIF92aXNpdChzZWxmLCBzdGFydDogc3RyLCB0YXJnZXRzOiB0eXBpbmcu Q2FsbGFibGVbW05vZGVdLCB0eXBpbmcuSXRlcmFibGVbc3RyXV0pIC0+IHR5cGluZy5JdGVy YXRvcltzdHJdOgogICAgICAgIHZpc2l0ZWQgPSBzZXQoKQoKICAgICAgICBkZWYgdmlzaXQo bjogTm9kZSkgLT4gdHlwaW5nLkl0ZXJhdG9yW3N0cl06CiAgICAgICAgICAgIGlmIG4ubmFt ZSBpbiB2aXNpdGVkOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHZpc2l0 ZWQuYWRkKG4ubmFtZSkKICAgICAgICAgICAgeWllbGQgbi51c2VybmFtZSBvciBuLm5hbWUK ICAgICAgICAgICAgZm9yIGNhbGxlciBpbiB0YXJnZXRzKG4pOgogICAgICAgICAgICAgICAg dGFyZ2V0ID0gc2VsZi5fZ2V0X25vZGUoY2FsbGVyKQogICAgICAgICAgICAgICAgaWYgdGFy Z2V0OgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gdmlzaXQodGFyZ2V0KQoKICAg ICAgICBuID0gc2VsZi5fZ2V0X25vZGUoc3RhcnQpCiAgICAgICAgaWYgbm90IG46CiAgICAg ICAgICAgIHJldHVybiBpdGVyKHt9KQogICAgICAgIHlpZWxkIGZyb20gdmlzaXQobikKCiAg ICBkZWYgYWxsX2NhbGxlcnMoc2VsZiwgY2FsbGVlOiBzdHIpIC0+IHR5cGluZy5JdGVyYXRv cltzdHJdOgogICAgICAgIHJldHVybiBzZWxmLl92aXNpdChjYWxsZWUsIGxhbWJkYSBuOiBu LmNhbGxlcnMpCgogICAgZGVmIGFsbF9jYWxsZWVzKHNlbGYsIGNhbGxlcjogc3RyKSAtPiB0 eXBpbmcuSXRlcmF0b3Jbc3RyXToKICAgICAgICByZXR1cm4gc2VsZi5fdmlzaXQoY2FsbGVy LCBsYW1iZGEgbjogbi5jYWxsZWVzLmtleXMoKSkKCiAgICBkZWYgY2FsbGVycyhzZWxmLCBj YWxsZWU6IHN0ciwgcmVmX29rOiBib29sKSAtPiB0eXBpbmcuSXRlcmF0b3Jbc3RyXToKICAg ICAgICBuID0gc2VsZi5fZ2V0X25vZGUoY2FsbGVlKQogICAgICAgIGlmIG5vdCBuOgogICAg ICAgICAgICByZXR1cm4gaXRlcihbXSkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBz ZWxmLm5hbWUoY2FsbGVyKQogICAgICAgICAgICBmb3IgY2FsbGVyIGluIG4uY2FsbGVycwog ICAgICAgICAgICBpZiBzZWxmLmZpbHRlcl9lZGdlKGNhbGxlciwgY2FsbGVlLCBUcnVlLCBy ZWZfb2spKQoKICAgIGRlZiBjYWxsZWVzKHNlbGYsIGNhbGxlcjogc3RyLCBleHRlcm5hbF9v azogYm9vbCwgcmVmX29rOiBib29sKSAtPiB0eXBpbmcuSXRlcmF0b3Jbc3RyXToKICAgICAg ICBuID0gc2VsZi5fZ2V0X25vZGUoY2FsbGVyKQogICAgICAgIGlmIG5vdCBuOgogICAgICAg ICAgICByZXR1cm4gaXRlcihbXSkKICAgICAgICByZXR1cm4gKHNlbGYubmFtZShjYWxsZWUp CiAgICAgICAgICAgICAgICBmb3IgY2FsbGVlIGluIG4uY2FsbGVlcy5rZXlzKCkKICAgICAg ICAgICAgICAgIGlmIHNlbGYuZmlsdGVyX2VkZ2UoY2FsbGVyLCBjYWxsZWUsIGV4dGVybmFs X29rLCByZWZfb2spKQoKICAgIGRlZiBhbGxfbm9kZXMoc2VsZikgLT4gdHlwaW5nLkl0ZXJh dG9yW3N0cl06CiAgICAgICAgcmV0dXJuIChzZWxmLm5hbWUoeCkKICAgICAgICAgICAgICAg IGZvciB4IGluIHNlbGYubm9kZXMua2V5cygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmZp bHRlcl9ub2RlKHgsIEZhbHNlKSkKCiAgICBkZWYgYWxsX25vZGVzX2Zvcl9maWxlKHNlbGYs IGZpbGU6IHN0cikgLT4gdHlwaW5nLkl0ZXJhdG9yW3N0cl06CiAgICAgICAgcmV0dXJuICh4 IGlmIHggaW4gc2VsZi5ub2Rlc19ieV91c2VybmFtZSBlbHNlIHNlbGYubmFtZSh4KQogICAg ICAgICAgICAgICAgZm9yIHggaW4gc2VsZi5maWxlc1tmaWxlXQogICAgICAgICAgICAgICAg aWYgc2VsZi5maWx0ZXJfbm9kZSh4LCBGYWxzZSkpCgogICAgZGVmIG5hbWUoc2VsZiwgeDog c3RyKSAtPiBzdHI6CiAgICAgICAgbiA9IHNlbGYubm9kZXNbeF0KICAgICAgICByZXR1cm4g bi51c2VybmFtZSBvciB4CgogICAgZGVmIF9maWx0ZXJfbm9kZShzZWxmLCBuOiBOb2RlLCBl eHRlcm5hbF9vazogYm9vbCkgLT4gYm9vbDoKICAgICAgICBpZiBub3QgZXh0ZXJuYWxfb2sg YW5kIG4uZXh0ZXJuYWw6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIHNl bGYua2VlcCBpcyBub3QgTm9uZSBhbmQgbi5uYW1lIGluIHNlbGYua2VlcDoKICAgICAgICAg ICAgcmV0dXJuIFRydWUKICAgICAgICBpZiBuLm5hbWUgaW4gc2VsZi5vbWl0OgogICAgICAg ICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5maWx0ZXJfZGVmYXVsdAoK ICAgIGRlZiBmaWx0ZXJfbm9kZShzZWxmLCB4OiBzdHIsIGV4dGVybmFsX29rOiBib29sKSAt PiBib29sOgogICAgICAgIG4gPSBzZWxmLl9nZXRfbm9kZSh4KQogICAgICAgIGlmIG5vdCBu OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5fZmlsdGVy X25vZGUobiwgZXh0ZXJuYWxfb2spCgogICAgZGVmIGZpbHRlcl9lZGdlKHNlbGYsIGNhbGxl cjogc3RyLCBjYWxsZWU6IHN0ciwgZXh0ZXJuYWxfb2s6IGJvb2wsIHJlZl9vazogYm9vbCkg LT4gYm9vbDoKICAgICAgICBjYWxsZXJfbm9kZSA9IHNlbGYuX2dldF9ub2RlKGNhbGxlcikK ICAgICAgICBpZiBub3QgY2FsbGVyX25vZGUgb3Igbm90IHNlbGYuX2ZpbHRlcl9ub2RlKGNh bGxlcl9ub2RlLCBUcnVlKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgY2Fs bGVlX25vZGUgPSBzZWxmLl9nZXRfbm9kZShjYWxsZWUpCiAgICAgICAgaWYgbm90IGNhbGxl ZV9ub2RlIG9yIG5vdCBzZWxmLl9maWx0ZXJfbm9kZShjYWxsZWVfbm9kZSwgZXh0ZXJuYWxf b2spOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gY2FsbGVyX25v ZGVbY2FsbGVlXSA9PSAiY2FsbCIgb3IgKHJlZl9vayBhbmQgbm90IGNhbGxlZV9ub2RlLmV4 dGVybmFsKQoKICAgIGRlZiBvbWl0X25vZGUoc2VsZiwgbmFtZTogc3RyKSAtPiBOb25lOgog ICAgICAgIG4gPSBzZWxmLl9nZXRfbm9kZShuYW1lKQogICAgICAgIG5hbWUgPSBuLm5hbWUg aWYgbiBlbHNlIG5hbWUKCiAgICAgICAgc2VsZi5vbWl0LmFkZChuYW1lKQogICAgICAgIGlm IHNlbGYua2VlcCBpcyBub3QgTm9uZSBhbmQgbmFtZSBpbiBzZWxmLmtlZXA6CiAgICAgICAg ICAgIHNlbGYua2VlcC5yZW1vdmUobmFtZSkKCiAgICBkZWYga2VlcF9ub2RlKHNlbGYsIG5h bWU6IHN0cikgLT4gTm9uZToKICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKICAgICAg ICAgICAgc2VsZi5rZWVwID0gc2V0KCkKCiAgICAgICAgbiA9IHNlbGYuX2dldF9ub2RlKG5h bWUpCiAgICAgICAgbmFtZSA9IG4ubmFtZSBpZiBuIGVsc2UgbmFtZQoKICAgICAgICBzZWxm LmtlZXAuYWRkKG5hbWUpCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLm9taXQ6CiAgICAgICAg ICAgIHNlbGYub21pdC5yZW1vdmUobmFtZSkKCiAgICBkZWYgcmVzZXRfZmlsdGVyKHNlbGYp IC0+IE5vbmU6CiAgICAgICAgc2VsZi5vbWl0ID0gc2V0KCkKICAgICAgICBzZWxmLmtlZXAg PSBOb25lCiAgICAgICAgc2VsZi5maWx0ZXJfZGVmYXVsdCA9IFRydWUKCgpHUkFQSCA9IEdy YXBoKCkKCgpjbGFzcyBOb1VzYWdlRm9ybWF0dGVyKGFyZ3BhcnNlLkhlbHBGb3JtYXR0ZXIp OgogICAgZGVmIGFkZF91c2FnZShzZWxmLCB1c2FnZTogdHlwaW5nLk9wdGlvbmFsW3N0cl0s IGFjdGlvbnM6IHR5cGluZy5JdGVyYWJsZVthcmdwYXJzZS5BY3Rpb25dLAogICAgICAgICAg ICAgICAgICBncm91cHM6IHR5cGluZy5JdGVyYWJsZVthcmdwYXJzZS5fQXJndW1lbnRHcm91 cF0sIHByZWZpeDogdHlwaW5nLk9wdGlvbmFsW3N0cl0gPSAuLi4pIC0+IE5vbmU6CiAgICAg ICAgcGFzcwoKCmNsYXNzIE15QXJndW1lbnRQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJz ZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAg c3VwZXIoKS5fX2luaXRfXyhleGl0X29uX2Vycm9yPUZhbHNlLCBhZGRfaGVscD1GYWxzZSwg Zm9ybWF0dGVyX2NsYXNzPU5vVXNhZ2VGb3JtYXR0ZXIpCgogICAgZGVmIGZvcm1hdF91c2Fn ZShzZWxmKToKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2Fn ZTogc3RyKToKICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudEVycm9yKE5vbmUsIGYi e3NlbGYucHJvZ306IGVycm9yOiB7bWVzc2FnZX0iICIiKQoKClBBUlNFUiA9IE15QXJndW1l bnRQYXJzZXIoKQoKCmNsYXNzIFZSQ0NvbW1hbmQ6CgogICAgTkFNRTogdHlwaW5nLk9wdGlv bmFsW3R1cGxlW3N0ciwgLi4uXV0gPSBOb25lCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYg YXJncyhzZWxmLCBwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKICAgICAgICAi IiJTZXR1cCBhcmd1bWVudCBwYXJzZXIiIiIKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihz ZWxmLCBhcmdzOiBhcmdwYXJzZS5OYW1lc3BhY2UpOgogICAgICAgICIiIlJ1biBjb21tYW5k LgogICAgICAgIGFyZ3M6IHBhcnNlZCBhcmd1bWVudCBieSBhcmd1bWVudCBwYXJzZXIuCiAg ICAgICAgYXJndjogcmVtYWluaW5nIGFyZ3VtZW50cyBmcm9tIHN5cy5hcmd2LgogICAgICAg ICIiIgogICAgICAgIHBhc3MKCgpjbGFzcyBDaGRpckNvbW1hbmQoVlJDQ29tbWFuZCk6CiAg ICAiIiJDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkuIiIiCiAgICBOQU1FID0gKCJjZCIsKQoK ICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGFyZ3Moc2VsZiwgcGFyc2VyOiBhcmdwYXJzZS5B cmd1bWVudFBhcnNlcik6CiAgICAgICAgIiIiU2V0dXAgYXJndW1lbnQgcGFyc2VyIiIiCiAg ICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiZGlyIiwgbWV0YXZhcj0iRElSIiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ik5ldyBjdXJyZW50IGRpcmVjdG9yeSIpCgog ICAgZGVmIHJ1bihzZWxmLCBhcmdzOiBhcmdwYXJzZS5OYW1lc3BhY2UpOgogICAgICAgIG9z LmNoZGlyKG9zLnBhdGguZXhwYW5kdXNlcihhcmdzLmRpcikpCgoKY2xhc3MgUHdkQ29tbWFu ZChWUkNDb21tYW5kKToKICAgICIiIlByaW50IGN1cnJlbnQgZGlyZWN0b3J5LiIiIgogICAg TkFNRSA9ICgicHdkIiwpCgogICAgZGVmIHJ1bihzZWxmLCBhcmdzOiBhcmdwYXJzZS5OYW1l c3BhY2UpOgogICAgICAgIHByaW50KG9zLmdldGN3ZCgpKQoKCmNsYXNzIEhpc3RvcnlDb21t YW5kKFZSQ0NvbW1hbmQpOgogICAgIiIiUHJpbnQgY29tbWFuZCBoaXN0b3J5LiIiIgogICAg TkFNRSA9ICgiaGlzdG9yeSIsKQoKICAgIGRlZiBydW4oc2VsZiwgYXJnczogYXJncGFyc2Uu TmFtZXNwYWNlKToKICAgICAgICAjIFRPRE86IGxpbWl0IGhpc3RvcnkgdG8gTiBlbnRyaWVz CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgcmVhZGxpbmUuZ2V0X2N1cnJlbnRfaGlzdG9y eV9sZW5ndGgoKSArIDEpOgogICAgICAgICAgICBwcmludCgnezo3fSB7fScuZm9ybWF0KGks IHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oaSkpKQoKCmNsYXNzIENvbXBkYkNvbW1hbmQo VlJDQ29tbWFuZCk6CiAgICAiIiJMb2FkcyBhIGNvbXBpbGVfY29tbWFuZHMuanNvbiBmaWxl LiIiIgogICAgTkFNRSA9ICgiY29tcGRiIiwpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYg YXJncyhzZWxmLCBwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKICAgICAgICAi IiJTZXR1cCBhcmd1bWVudCBwYXJzZXIiIiIKICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50 KCJmaWxlIiwgbWV0YXZhcj0iRklMRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBo ZWxwPSJKU09OIGZpbGUgdG8gYmUgbG9hZGVkIikKCiAgICBkZWYgcnVuKHNlbGYsIGFyZ3M6 IGFyZ3BhcnNlLk5hbWVzcGFjZSk6CiAgICAgICAgd2l0aCBvcGVuKGFyZ3MuZmlsZSwgJ3In KSBhcyBmOgogICAgICAgICAgICBmb3IgZW50cnkgaW4ganNvbi5sb2FkKGYpOgogICAgICAg ICAgICAgICAga2V5ID0gb3MucGF0aC5yZWxwYXRoKG9zLnBhdGguam9pbihlbnRyeVsiZGly ZWN0b3J5Il0sIGVudHJ5WyJvdXRwdXQiXSkpCiAgICAgICAgICAgICAgICBDT01QREJba2V5 XSA9IGVudHJ5WyJjb21tYW5kIl0KCkNPTVBEQjogZGljdFtzdHIsIHN0cl0gPSBkaWN0KCkK CgpjbGFzcyBMb2FkQ29tbWFuZChWUkNDb21tYW5kKToKICAgICIiIkxvYWRzIGEgR0NDIFJU TCBvdXRwdXQgKC5leHBhbmQsIGdlbmVyYXRlZCBieSAtZmR1bXAtcnRsLWV4cGFuZCkuIiIi CiAgICBOQU1FID0gKCJsb2FkIiwpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYXJncyhz ZWxmLCBwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKICAgICAgICAiIiJTZXR1 cCBhcmd1bWVudCBwYXJzZXIiIiIKICAgICAgICBkZWYgZWF0KCphcmdzOiBsaXN0W3R5cGlu Zy5BbnldKSAtPiBOb25lOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcmludF9z dGRlcnIoKmFyZ3M6IGxpc3RbdHlwaW5nLkFueV0pIC0+IE5vbmU6CiAgICAgICAgICAgIHBy aW50KCphcmdzLCBmaWxlPXN5cy5zdGRlcnIpCgogICAgICAgIHBhcnNlci5hZGRfYXJndW1l bnQoIi0tdmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3Q9cHJpbnRfc3RkZXJyLCBkZWZhdWx0PWVhdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGhlbHA9IlJlcG9ydCBwcm9ncmVzcyB3aGlsZSBwYXJzaW5n IikKICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJmaWxlcyIsIG1ldGF2YXI9IkZJTEUi LCBuYXJncz0iKyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEdW1wIG9y IG9iamVjdCBmaWxlIHRvIGJlIGxvYWRlZCIpCgogICAgZGVmIHJ1bihzZWxmLCBhcmdzOiBh cmdwYXJzZS5OYW1lc3BhY2UpOgogICAgICAgIGRlZiBidWlsZF9nY2NfU19jb21tYW5kX2xp bmUoY21kLCBvdXRmaWxlKToKICAgICAgICAgICAgYXJncyA9IHNobGV4LnNwbGl0KGNtZCkK ICAgICAgICAgICAgb3V0ID0gW10KICAgICAgICAgICAgd2FzX28gPSBGYWxzZQogICAgICAg ICAgICBmb3IgaSBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgd2FzX286CiAgICAgICAg ICAgICAgICAgICAgaSA9ICcvZGV2L251bGwnCiAgICAgICAgICAgICAgICAgICAgd2FzX28g PSBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBpID09ICctYyc6CiAgICAgICAgICAgICAg ICAgICAgaSA9ICctUycKICAgICAgICAgICAgICAgIGVsaWYgaSA9PSAnLW8nOgogICAgICAg ICAgICAgICAgICAgIHdhc19vID0gVHJ1ZQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChp KQogICAgICAgICAgICByZXR1cm4gb3V0ICsgWyctZmR1bXAtcnRsLWV4cGFuZCcsICctZHVt cGJhc2UnLCBvdXRmaWxlXQoKICAgICAgICBkZWYgZXhwYW5kKGZpbGVzOiB0eXBpbmcuSXRl cmF0b3Jbc3RyXSkgLT4gdHlwaW5nLkl0ZXJhdG9yW3R1cGxlW3N0ciwgaW8uVGV4dElPV3Jh cHBlcl1dOgogICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQogICAgICAgICAgICBmb3Ig cGF0dGVybiBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGZvciBmbiBpbiBnbG9iLmdsb2Io b3MucGF0aC5leHBhbmR1c2VyKHBhdHRlcm4pLCByb290X2Rpcj1jd2QpOgogICAgICAgICAg ICAgICAgICAgIGlmIGZuLmVuZHN3aXRoKCIubyIpOgogICAgICAgICAgICAgICAgICAgICAg ICBvYmpmaWxlID0gb3MucGF0aC5yZWxwYXRoKGZuKQogICAgICAgICAgICAgICAgICAgICAg ICBpZiBvYmpmaWxlIG5vdCBpbiBDT01QREI6CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwcmludChmIkNvdWxkIG5vdCBmaW5kICd7b2JqZmlsZX0nIGluIGNvbXBpbGVfY29tbWFu ZHMuanNvbiIsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnRpbnVlCgogICAgICAgICAgICAgICAgICAgICAgICBkdW1wcyA9IGdsb2IuZ2xvYihv YmpmaWxlICsgIi4qci5leHBhbmQiKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4o ZHVtcHMpID4gMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGYiRm91bmQg bW9yZSB0aGFuIG9uZSBkdW1wIGZpbGU6IHsnLCAnLmpvaW4oZHVtcHMpfSIsIGZpbGU9c3lz LnN0ZGVycikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAg ICAgICAgICAgICAgICAgICBpZiBub3QgZHVtcHM6CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjbWRsaW5lID0gYnVpbGRfZ2NjX1NfY29tbWFuZF9saW5lKENPTVBEQltvYmpmaWxl XSwgb2JqZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MudmVyYm9zZShm IkxhdW5jaGluZyB7c2hsZXguam9pbihjbWRsaW5lKX0iKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9 IHN1YnByb2Nlc3MucnVuKGNtZGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5ERVZOVUxMKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0IGFz IGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIkludGVycnVwdCIs IGZpbGU9c3lzLnN0ZGVycikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh awogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0g MDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludChmIkNvbXBpbGVyIGV4 aXRlZCB3aXRoIHJldHVybiBjb2RlIHtyZXN1bHQucmV0dXJuY29kZX0iLCBmaWxlPXN5cy5z dGRlcnIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGR1bXBzID0gZ2xvYi5nbG9iKG9iamZpbGUgKyAiLipy LmV4cGFuZCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZHVtcHMpID4g MToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludChmIkZvdW5kIG1vcmUg dGhhbiBvbmUgZHVtcCBmaWxlOiB7JywgJy5qb2luKGR1bXBzKX0iLCBmaWxlPXN5cy5zdGRl cnIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAg ICAgICAgICAgICAgICAgIGZuID0gZHVtcHNbMF0KICAgICAgICAgICAgICAgICAgICAgICAg cHJpbnQoZiJSZWFkaW5nIHtmbn0iLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgICAgICAg ICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYXJncy52ZXJib3NlKGYiUmVh ZGluZyB7Zm59IikKCiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGZuLCAiciIpIGFz IGY6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGZuLCBmCgogICAgICAgIGZvciBm biwgZiBpbiBleHBhbmQoYXJncy5maWxlcyk6CiAgICAgICAgICAgIEdSQVBILnBhcnNlKGZu LCBmLCB2ZXJib3NlX3ByaW50PWFyZ3MudmVyYm9zZSkKCgpjbGFzcyBOb2RlQ29tbWFuZChW UkNDb21tYW5kKToKICAgICIiIkNyZWF0ZXMgYSBuZXcgbm9kZSBmb3IgYSBub24tZXh0ZXJu YWwgc3ltYm9sLiIiIgogICAgTkFNRSA9ICgibm9kZSIsKQoKICAgIEBjbGFzc21ldGhvZAog ICAgZGVmIGFyZ3Moc2VsZiwgcGFyc2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CiAg ICAgICAgIiIiU2V0dXAgYXJndW1lbnQgcGFyc2VyIiIiCiAgICAgICAgcGFyc2VyLmFkZF9h cmd1bWVudCgibmFtZSIsIG1ldGF2YXI9Ik5BTUUiLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgaGVscD0iTmFtZSBmb3IgdGhlIG5ldyBub2RlIikKICAgICAgICBwYXJzZXIuYWRk X2FyZ3VtZW50KCJmaWxlIiwgbWV0YXZhcj0iRklMRSIsIG5hcmdzPSI/IiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGhlbHA9IkZpbGUgaW4gd2hpY2ggdGhlIG5ldyBub2RlIGlz IGRlZmluZWQiKQoKICAgIGRlZiBydW4oc2VsZiwgYXJnczogYXJncGFyc2UuTmFtZXNwYWNl KToKICAgICAgICBHUkFQSC5hZGRfbm9kZShhcmdzLm5hbWUsIGZpbGU9YXJncy5maWxlKQoK CmNsYXNzIEVkZ2VDb21tYW5kKFZSQ0NvbW1hbmQpOgogICAgIiIiQ3JlYXRlcyBhIG5ldyBl ZGdlLiAgVGhlIGNhbGxlciBtdXN0IGV4aXN0IGFscmVhZHkuIiIiCiAgICBOQU1FID0gKCJl ZGdlIiwpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYXJncyhzZWxmLCBwYXJzZXI6IGFy Z3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKICAgICAgICAiIiJTZXR1cCBhcmd1bWVudCBwYXJz ZXIiIiIKICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJjYWxsZXIiLCBtZXRhdmFyPSJD QUxMRVIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU291cmNlIG5vZGUg Zm9yIHRoZSBuZXcgZWRnZSIpCiAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiY2FsbGVl IiwgbWV0YXZhcj0iQ0FMTEVFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9 IlRhcmdldCBub2RlIGZvciB0aGUgbmV3IGVkZ2UiKQogICAgICAgIHBhcnNlci5hZGRfYXJn dW1lbnQoInR5cGUiLCBtZXRhdmFyPSJUWVBFIiwgbmFyZ3M9Ij8iLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgaGVscD0iVHlwZSBvZiB0aGUgbmV3IGVkZ2UgKGNhbGwgb3IgcmVm KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsiY2FsbCIsICJyZWYi XSwgZGVmYXVsdD0iY2FsbCIpCgogICAgZGVmIHJ1bihzZWxmLCBhcmdzOiBhcmdwYXJzZS5O YW1lc3BhY2UpOgogICAgICAgIGlmIG5vdCBHUkFQSC5oYXNfbm9kZShhcmdzLmNhbGxlcik6 CiAgICAgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50RXJyb3IoTm9uZSwgImNhbGxl ciBub3QgZm91bmQgaW4gZ3JhcGgiKQogICAgICAgIEdSQVBILmFkZF9lZGdlKGFyZ3MuY2Fs bGVyLCBhcmdzLmNhbGxlZSwgYXJncy50eXBlKQoKCmNsYXNzIE9taXRDb21tYW5kKFZSQ0Nv bW1hbmQpOgogICAgIiIiUmVtb3ZlcyBhIG5vZGUsIGFuZCBvcHRpb25hbGx5IGl0cyBjYWxs ZXJzIGFuZC9vciBjYWxsZWVzLCBmcm9tCiAgICAgICB0aGUgZ3JhcGggdGhhdCBpcyBnZW5l cmF0ZWQgYnkgIm91dHB1dCIgb3IgImRvdHR5Ii4iIiIKICAgIE5BTUUgPSAoIm9taXQiLCkK CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBhcmdzKHNlbGYsIHBhcnNlcjogYXJncGFyc2Uu QXJndW1lbnRQYXJzZXIpOgogICAgICAgICIiIlNldHVwIGFyZ3VtZW50IHBhcnNlciIiIgog ICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tY2FsbGVycyIsIGFjdGlvbj0ic3RvcmVf dHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJPbWl0IGFsbCBjYWxs ZXJzLCByZWN1cnNpdmVseS4iKQogICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tY2Fs bGVlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBoZWxwPSJPbWl0IGFsbCBjYWxsZWVzLCByZWN1cnNpdmVseS4iKQogICAgICAgIHBhcnNl ci5hZGRfYXJndW1lbnQoImZ1bmNzIiwgbWV0YXZhcj0iRlVOQyIsIG5hcmdzPSIrIiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBmdW5jdGlvbnMgdG8gYmUgZmls dGVyZWQiKQoKICAgIGRlZiBydW4oc2VsZiwgYXJnczogYXJncGFyc2UuTmFtZXNwYWNlKToK ICAgICAgICBmb3IgZiBpbiBhcmdzLmZ1bmNzOgogICAgICAgICAgICBHUkFQSC5vbWl0X25v ZGUoZikKICAgICAgICAgICAgaWYgYXJncy5jYWxsZXJzOgogICAgICAgICAgICAgICAgZm9y IGNhbGxlciBpbiBHUkFQSC5hbGxfY2FsbGVycyhmKToKICAgICAgICAgICAgICAgICAgICBH UkFQSC5vbWl0X25vZGUoY2FsbGVyKQogICAgICAgICAgICBpZiBhcmdzLmNhbGxlZXM6CiAg ICAgICAgICAgICAgICBmb3IgY2FsbGVlIGluIEdSQVBILmFsbF9jYWxsZWVzKGYpOgogICAg ICAgICAgICAgICAgICAgIEdSQVBILm9taXRfbm9kZShjYWxsZWUpCgoKY2xhc3MgS2VlcENv bW1hbmQoVlJDQ29tbWFuZCk6CiAgICAiIiJVbmRvZXMgdGhlIGVmZmVjdCBvZiAib21pdCIg b24gYSBub2RlLCBhbmQgb3B0aW9uYWxseQogICAgICAgaXRzIGNhbGxlcnMgYW5kL29yIGNh bGxlZXMuIiIiCiAgICBOQU1FID0gKCJrZWVwIiwpCgogICAgQGNsYXNzbWV0aG9kCiAgICBk ZWYgYXJncyhzZWxmLCBwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKICAgICAg ICAiIiJTZXR1cCBhcmd1bWVudCBwYXJzZXIiIiIKICAgICAgICBwYXJzZXIuYWRkX2FyZ3Vt ZW50KCItLWNhbGxlcnMiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgaGVscD0iS2VlcCBhbGwgY2FsbGVycywgcmVjdXJzaXZlbHkuIikKICAg ICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNhbGxlZXMiLCBhY3Rpb249InN0b3JlX3Ry dWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iS2VlcCBhbGwgY2FsbGVl cywgcmVjdXJzaXZlbHkuIikKICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJmdW5jcyIs IG1ldGF2YXI9IkZVTkMiLCBuYXJncz0iKyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBoZWxwPSJUaGUgZnVuY3Rpb25zIHRvIGJlIGZpbHRlcmVkIikKCiAgICBkZWYgcnVuKHNl bGYsIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSk6CiAgICAgICAgZm9yIGYgaW4gYXJncy5m dW5jczoKICAgICAgICAgICAgR1JBUEgua2VlcF9ub2RlKGYpCiAgICAgICAgICAgIGlmIGFy Z3MuY2FsbGVyczoKICAgICAgICAgICAgICAgIGZvciBjYWxsZXIgaW4gR1JBUEguYWxsX2Nh bGxlcnMoZik6CiAgICAgICAgICAgICAgICAgICAgR1JBUEgua2VlcF9ub2RlKGNhbGxlcikK ICAgICAgICAgICAgaWYgYXJncy5jYWxsZWVzOgogICAgICAgICAgICAgICAgZm9yIGNhbGxl ZSBpbiBHUkFQSC5hbGxfY2FsbGVlcyhmKToKICAgICAgICAgICAgICAgICAgICBHUkFQSC5r ZWVwX25vZGUoY2FsbGVlKQoKCmNsYXNzIE9ubHlDb21tYW5kKFZSQ0NvbW1hbmQpOgogICAg IiIiTGltaXRzIHRoZSBncmFwaCB0aGF0IGlzIGdlbmVyYXRlZCBieSAib3V0cHV0IiBvciAi ZG90dHkiCiAgICAgICB0byBhIG5vZGUsIGFuZCBvcHRpb25hbGx5IGl0cyBjYWxsZXJzIGFu ZC9vciBjYWxsZWVzLgogICAgICAgSWYgaW52b2tlZCBtdWx0aXBsZSB0aW1lcywgdGhlIGZp bHRlcnMgYXJlIE9SZWQuICBOb2RlcwogICAgICAgYWRkZWQgYnkgImtlZXAiIGFyZSBpbmNs dWRlZCB0b28uIiIiCiAgICBOQU1FID0gKCJvbmx5IiwpCgogICAgQGNsYXNzbWV0aG9kCiAg ICBkZWYgYXJncyhzZWxmLCBwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKICAg ICAgICAiIiJTZXR1cCBhcmd1bWVudCBwYXJzZXIiIiIKICAgICAgICBwYXJzZXIuYWRkX2Fy Z3VtZW50KCItLWNhbGxlcnMiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgaGVscD0iS2VlcCBhbGwgY2FsbGVycywgcmVjdXJzaXZlbHkuIikK ICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNhbGxlZXMiLCBhY3Rpb249InN0b3Jl X3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iS2VlcCBhbGwgY2Fs bGVlcywgcmVjdXJzaXZlbHkuIikKICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJmdW5j cyIsIG1ldGF2YXI9IkZVTkMiLCBuYXJncz0iKyIsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBoZWxwPSJUaGUgZnVuY3Rpb25zIHRvIGJlIGZpbHRlcmVkIikKCiAgICBkZWYgcnVu KHNlbGYsIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSk6CiAgICAgICAgR1JBUEguZmlsdGVy X2RlZmF1bHQgPSBGYWxzZQogICAgICAgIGZvciBmIGluIGFyZ3MuZnVuY3M6CiAgICAgICAg ICAgIEdSQVBILmtlZXBfbm9kZShmKQogICAgICAgICAgICBpZiBhcmdzLmNhbGxlcnM6CiAg ICAgICAgICAgICAgICBmb3IgY2FsbGVyIGluIEdSQVBILmFsbF9jYWxsZXJzKGYpOgogICAg ICAgICAgICAgICAgICAgIEdSQVBILmtlZXBfbm9kZShjYWxsZXIpCiAgICAgICAgICAgIGlm IGFyZ3MuY2FsbGVlczoKICAgICAgICAgICAgICAgIGZvciBjYWxsZWUgaW4gR1JBUEguYWxs X2NhbGxlZXMoZik6CiAgICAgICAgICAgICAgICAgICAgR1JBUEgua2VlcF9ub2RlKGNhbGxl ZSkKCgpjbGFzcyBSZXNldENvbW1hbmQoVlJDQ29tbWFuZCk6CiAgICAiIiJVbmRvZXMgYW55 IGZpbHRlcmluZyBkb25lIGJ5IHRoZSAia2VlcCIgb3IgIm9taXQiIGNvbW1hbmRzLiIiIgog ICAgTkFNRSA9ICgicmVzZXQiLCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBhcmdzKHNl bGYsIHBhcnNlcjogYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgogICAgICAgICIiIlNldHVw IGFyZ3VtZW50IHBhcnNlciIiIgogICAgICAgIHBhc3MKCiAgICBkZWYgcnVuKHNlbGYsIGFy Z3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSk6CiAgICAgICAgR1JBUEgucmVzZXRfZmlsdGVyKCkK CgpjbGFzcyBDYWxsZXJzQ29tbWFuZChWUkNDb21tYW5kKToKICAgICIiIlByaW50cyB0aGUg Y2FsbGVyIG9mIGFsbCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9ucy4iIiIKICAgIE5BTUUgPSAo ImNhbGxlcnMiLCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBhcmdzKHNlbGYsIHBhcnNl cjogYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgogICAgICAgICIiIlNldHVwIGFyZ3VtZW50 IHBhcnNlciIiIgogICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0taW5jbHVkZS1yZWYi LCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVs cD0iSW5jbHVkZSByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucy4iKQogICAgICAgIHBhcnNlci5h ZGRfYXJndW1lbnQoImZ1bmNzIiwgbWV0YXZhcj0iRlVOQyIsIG5hcmdzPSIrIiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBmdW5jdGlvbnMgdG8gYmUgZmlsdGVy ZWQiKQoKICAgIGRlZiBydW4oc2VsZiwgYXJnczogYXJncGFyc2UuTmFtZXNwYWNlKToKICAg ICAgICByZXN1bHQgPSBkZWZhdWx0ZGljdChsYW1iZGE6IGxpc3QoKSkKICAgICAgICBmb3Ig ZiBpbiBhcmdzLmZ1bmNzOgogICAgICAgICAgICBmb3IgaSBpbiBHUkFQSC5jYWxsZXJzKGYs IHJlZl9vaz1hcmdzLmluY2x1ZGVfcmVmKToKICAgICAgICAgICAgICAgIHJlc3VsdFtpXS5h cHBlbmQoZikKCiAgICAgICAgZm9yIGNhbGxlciwgY2FsbGVlcyBpbiByZXN1bHQuaXRlbXMo KToKICAgICAgICAgICAgcHJpbnQoZiJ7Y2FsbGVyfSAtPiB7JywgJy5qb2luKGNhbGxlZXMp fSIpCgoKY2xhc3MgQ2FsbGVlc0NvbW1hbmQoVlJDQ29tbWFuZCk6CiAgICAiIiJQcmludHMg dGhlIGNhbGxlZXMgb2YgYWxsIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb25zLiIiIgogICAgTkFN RSA9ICgiY2FsbGVlcyIsKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGFyZ3Moc2VsZiwg cGFyc2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CiAgICAgICAgIiIiU2V0dXAgYXJn dW1lbnQgcGFyc2VyIiIiCiAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1pbmNsdWRl LWV4dGVybmFsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGhlbHA9IkluY2x1ZGUgZXh0ZXJuYWwgZnVuY3Rpb25zLiIpCiAgICAgICAgcGFy c2VyLmFkZF9hcmd1bWVudCgiLS1pbmNsdWRlLXJlZiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJJbmNsdWRlIHJlZmVyZW5jZXMg dG8gZnVuY3Rpb25zLiIpCiAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiZnVuY3MiLCBt ZXRhdmFyPSJGVU5DIiwgbmFyZ3M9IisiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg aGVscD0iVGhlIGZ1bmN0aW9ucyB0byBiZSBmaWx0ZXJlZCIpCgogICAgZGVmIHJ1bihzZWxm LCBhcmdzOiBhcmdwYXJzZS5OYW1lc3BhY2UpOgogICAgICAgIHJlc3VsdCA9IGRlZmF1bHRk aWN0KGxhbWJkYTogbGlzdCgpKQogICAgICAgIGZvciBmIGluIGFyZ3MuZnVuY3M6CiAgICAg ICAgICAgIGZvciBpIGluIEdSQVBILmNhbGxlZXMoZiwgZXh0ZXJuYWxfb2s9YXJncy5pbmNs dWRlX2V4dGVybmFsLCByZWZfb2s9YXJncy5pbmNsdWRlX3JlZik6CiAgICAgICAgICAgICAg ICByZXN1bHRbaV0uYXBwZW5kKGYpCgogICAgICAgIGZvciBjYWxsZWUsIGNhbGxlcnMgaW4g cmVzdWx0Lml0ZW1zKCk6CiAgICAgICAgICAgIHByaW50KGYieycsICcuam9pbihjYWxsZXJz KX0gLT4ge2NhbGxlZX0iKQoKCmNsYXNzIE91dHB1dENvbW1hbmQoVlJDQ29tbWFuZCk6CiAg ICAiIiJDcmVhdGVzIGEgRE9UIGZpbGUgd2l0aCB0aGUgY2FsbGdyYXBoLiAgSWYgaW52b2tl ZCBhcyAiZG90dHkiIGFuZAogICAgICAgd2l0aCBubyBhcmd1bWVudHMsIHRoZSBncmFwaCBp cyBsYWlkIG91dCBhbmQgc2hvd2VkIGluIGEgZ3JhcGhpY2FsCiAgICAgICB3aW5kb3cuIiIi CiAgICBOQU1FID0gKCJvdXRwdXQiLCAiZG90dHkiKQoKICAgIEBjbGFzc21ldGhvZAogICAg ZGVmIGFyZ3Moc2VsZiwgcGFyc2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CiAgICAg ICAgIiIiU2V0dXAgYXJndW1lbnQgcGFyc2VyIiIiCiAgICAgICAgcGFyc2VyLmFkZF9hcmd1 bWVudCgiLS1maWxlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBoZWxwPSJDcmVhdGUgYm94IGNvbnRhaW5lcnMgZm9yIHNvdXJjZSBmaWxl cy4iKQogICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0taW5jbHVkZS1leHRlcm5hbCIs IGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxw PSJJbmNsdWRlIGV4dGVybmFsIGZ1bmN0aW9ucy4iKQogICAgICAgIHBhcnNlci5hZGRfYXJn dW1lbnQoIi0taW5jbHVkZS1yZWYiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgaGVscD0iSW5jbHVkZSByZWZlcmVuY2VzIHRvIGZ1bmN0aW9u cy4iKQogICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoImZpbGUiLCBtZXRhdmFyPSJGSUxF IiwgbmFyZ3M9Ij8iKQoKICAgIGRlZiBydW4oc2VsZiwgYXJnczogYXJncGFyc2UuTmFtZXNw YWNlKToKICAgICAgICBkZWYgZW1pdChmKToKICAgICAgICAgICAgcHJpbnQoImRpZ3JhcGgg Y2FsbGdyYXBoIHsiLCBmaWxlPWYpCiAgICAgICAgICAgIG5vZGVzID0gc2V0KCkKICAgICAg ICAgICAgZm9yIGZ1bmMgaW4gR1JBUEguYWxsX25vZGVzKCk6CiAgICAgICAgICAgICAgICBu b2Rlcy5hZGQoZnVuYykKCiAgICAgICAgICAgIGlmIGFyZ3MuZmlsZXM6CiAgICAgICAgICAg ICAgICBpID0gMAogICAgICAgICAgICAgICAgZm9yIGZpbGUgaW4gR1JBUEguZmlsZXMua2V5 cygpOgogICAgICAgICAgICAgICAgICAgIGZpbGVfbm9kZXMgPSBsaXN0KEdSQVBILmFsbF9u b2Rlc19mb3JfZmlsZShmaWxlKSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlsZV9u b2RlczoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAg ICAgICBwcmludChmInN1YmdyYXBoIGNsdXN0ZXJfe2l9IiwgInsiLCBmaWxlPWYpCiAgICAg ICAgICAgICAgICAgICAgcHJpbnQoZidsYWJlbCA9ICJ7ZmlsZX0iOycsIGZpbGU9ZikKICAg ICAgICAgICAgICAgICAgICBmb3IgZnVuYyBpbiBmaWxlX25vZGVzOgogICAgICAgICAgICAg ICAgICAgICAgICBwcmludChmJyJ7ZnVuY30iOycsIGZpbGU9ZikKICAgICAgICAgICAgICAg ICAgICBwcmludCgifSIsIGZpbGU9ZikKICAgICAgICAgICAgICAgICAgICBpICs9IDEKCiAg ICAgICAgICAgIGNvbm5lY3RlZCA9IHNldCgpCiAgICAgICAgICAgIGZvciBmdW5jIGluIG5v ZGVzOgogICAgICAgICAgICAgICAgaGFzX2VkZ2VzID0gRmFsc2UKICAgICAgICAgICAgICAg IGZvciBpIGluIEdSQVBILmNhbGxlZXMoZnVuYywgZXh0ZXJuYWxfb2s9YXJncy5pbmNsdWRl X2V4dGVybmFsLCByZWZfb2s9YXJncy5pbmNsdWRlX3JlZik6CiAgICAgICAgICAgICAgICAg ICAgcHJpbnQoZicie2Z1bmN9IiAtPiAie2l9IjsnLCBmaWxlPWYpCiAgICAgICAgICAgICAg ICAgICAgY29ubmVjdGVkLmFkZChpKQogICAgICAgICAgICAgICAgICAgIGhhc19lZGdlcyA9 IFRydWUKICAgICAgICAgICAgICAgIGlmIGhhc19lZGdlczoKICAgICAgICAgICAgICAgICAg ICBjb25uZWN0ZWQuYWRkKGZ1bmMpCgogICAgICAgICAgICBmb3IgZnVuYyBpbiBub2RlczoK ICAgICAgICAgICAgICAgIGlmIGZ1bmMgbm90IGluIGNvbm5lY3RlZDoKICAgICAgICAgICAg ICAgICAgICBwcmludChmJyJ7ZnVuY30iOycsIGZpbGU9ZikKCiAgICAgICAgICAgIHByaW50 KCJ9IiwgZmlsZT1mKQoKICAgICAgICBpZiBhcmdzLmZpbGU6CiAgICAgICAgICAgIGZuID0g b3MucGF0aC5leHBhbmR1c2VyKGFyZ3MuZmlsZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGZu LCAidyIpIGFzIGY6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAg ZW1pdChmKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAg ICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICAgICAgICAgICAgICByYWlzZSBl CiAgICAgICAgZWxpZiBhcmdzLmNtZCA9PSAiZG90dHkiOgogICAgICAgICAgICBncmFwaCA9 IGlvLlN0cmluZ0lPKCkKICAgICAgICAgICAgZW1pdChncmFwaCkKICAgICAgICAgICAgZG90 dHkgPSBzdWJwcm9jZXNzLlBvcGVuKCJkb3R0eSAtIiwgc3RkaW49c3VicHJvY2Vzcy5QSVBF LCBzaGVsbD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJy b3JzPSJiYWNrc2xhc2hyZXBsYWNlIiwgZW5jb2Rpbmc9ImFzY2lpIikKICAgICAgICAgICAg ZG90dHkuY29tbXVuaWNhdGUoZ3JhcGguZ2V0dmFsdWUoKSkKICAgICAgICBlbHNlOgogICAg ICAgICAgICBlbWl0KHN5cy5zdGRvdXQpCgoKY2xhc3MgUXVpdENvbW1hbmQoVlJDQ29tbWFu ZCk6CiAgICAiIiJFeGl0cyBWUkMuIiIiCiAgICBOQU1FID0gKCJxIiwgInF1aXQiKQoKICAg IEBjbGFzc21ldGhvZAogICAgZGVmIHJ1bihzZWxmLCBhcmdzOiBhcmdwYXJzZS5OYW1lc3Bh Y2UpOgogICAgICAgIHN5cy5leGl0KDApCgoKY2xhc3MgSGVscENvbW1hbmQoVlJDQ29tbWFu ZCk6CiAgICAiIiJQcmludHMgdGhlIGxpc3Qgb2YgY29tbWFuZHMsIG9yIHRoZSBzeW50YXgg b2YgYSBjb21tYW5kLiIiIgogICAgTkFNRSA9ICgiaGVscCIsKQogICAgUEFSU0VSUzogZGlj dFtzdHIsIGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyXSA9IHt9CgogICAgQGNsYXNzbWV0aG9k CiAgICBkZWYgYXJncyhzZWxmLCBwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToK ICAgICAgICAiIiJTZXR1cCBhcmd1bWVudCBwYXJzZXIiIiIKICAgICAgICBwYXJzZXIuYWRk X2FyZ3VtZW50KCJjb21tYW5kIiwgbWV0YXZhcj0iQ09NTUFORCIsIG5hcmdzPSI/IiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNob3cgaGVscCBmb3IgZ2l2ZW4gY29t bWFuZC4iKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGNvbW1h bmQ6IHN0ciwgcGFyc2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CiAgICAgICAgc2Vs Zi5QQVJTRVJTW2NvbW1hbmRdID0gcGFyc2VyCgogICAgZGVmIHJ1bihzZWxmLCBhcmdzOiBh cmdwYXJzZS5OYW1lc3BhY2UpOgogICAgICAgIGlmIGFyZ3MuY29tbWFuZCBhbmQgYXJncy5j b21tYW5kIGluIHNlbGYuUEFSU0VSUzoKICAgICAgICAgICAgc2VsZi5QQVJTRVJTW2FyZ3Mu Y29tbWFuZF0ucHJpbnRfaGVscCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgUEFSU0VS LnByaW50X2hlbHAoKQoKCmNsYXNzIFJlYWRsaW5lSW5wdXQ6CiAgICBkZWYgX19pbml0X18o c2VsZiwgcHJvbXB0OiBzdHIpOgogICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0CiAgICAg ICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoInRhYjogY29tcGxldGUiKQogICAgICAgIHJl YWRsaW5lLnNldF9jb21wbGV0ZXIoc2VsZi5jb21wbGV0ZSkKICAgICAgICByZWFkbGluZS5z ZXRfY29tcGxldGVyX2RlbGltcygnIFx0JykKICAgICAgICByZWFkbGluZS5zZXRfY29tcGxl dGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayhzZWxmLmRpc3BsYXlfbWF0Y2hlcykKCiAgICBk ZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19uZXh0 X18oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gaW5wdXQoc2VsZi5w cm9tcHQpCiAgICAgICAgZXhjZXB0IEVPRkVycm9yOgogICAgICAgICAgICBwcmludCgpCiAg ICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCiAgICBkZWYgY29tcGxldGUoc2VsZiwg dGV4dDogc3RyLCBzdGF0ZTogaW50KSAtPiB0eXBpbmcuT3B0aW9uYWxbc3RyXToKICAgICAg ICBpZiBzdGF0ZSA9PSAwOgogICAgICAgICAgICBzZWxmLm1hdGNoZXMgPSBzZWxmLmdldF9t YXRjaGVzKHRleHQpCiAgICAgICAgaWYgc3RhdGUgPj0gbGVuKHNlbGYubWF0Y2hlcyk6CiAg ICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlc1tzdGF0 ZV0KCiAgICBkZWYgZ2V0X21hdGNoZXMoc2VsZiwgdGV4dDogc3RyKToKICAgICAgICBsaW5l ID0gcmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKICAgICAgICB3b3JkcyA9IGxpbmUuc3Ry aXAoKS5zcGxpdCgpCiAgICAgICAgbndvcmRzID0gbGVuKHdvcmRzKSAtICgwIGlmIG5vdCBs aW5lIG9yIGxpbmVbLTFdIGluICIgXHQiIGVsc2UgMSkKCgkgICAgIyBFeHBhbmQgdGhlIHRl eHQgdGhhdCBpcyB1c2VkIGZvciBjb21wbGV0aW9uCiAgICAgICAgcmVwbGFjZW1lbnQgPSBz ZWxmLmdldF9mb3JjZWRfcmVwbGFjZW1lbnQod29yZHMsIG53b3JkcywgdGV4dCkKICAgICAg ICBpZiByZXBsYWNlbWVudDoKICAgICAgICAgICAgdGV4dCA9IHJlcGxhY2VtZW50CgogICAg ICAgIGNvbXBsZXRpb25zID0gc2VsZi5nZXRfY29tcGxldGlvbnMod29yZHMsIG53b3Jkcywg dGV4dCkKICAgICAgICBjb21wbGV0aW9ucyA9IFt4IGZvciB4IGluIGNvbXBsZXRpb25zIGlm IHguc3RhcnRzd2l0aCh0ZXh0KV0KICAgICAgICBpZiBsZW4oY29tcGxldGlvbnMpID09IDEg XAogICAgICAgICAgICBhbmQgKHRleHQgIT0gIiIgb3Igbm90IGNvbXBsZXRpb25zWzBdLnN0 YXJ0c3dpdGgoIi0iKSkgXAogICAgICAgICAgICBhbmQgbm90IGNvbXBsZXRpb25zWzBdLmVu ZHN3aXRoKCIvIik6CiAgICAgICAgICAgIHJldHVybiBbY29tcGxldGlvbnNbMF0gKyAiICJd CiAgICAgICAgaWYgbGVuKGNvbXBsZXRpb25zKSA+IDEgYW5kIHJlcGxhY2VtZW50OgogICAg ICAgICAgICByZXR1cm4gW3JlcGxhY2VtZW50XQogICAgICAgIHJldHVybiBjb21wbGV0aW9u cwoKICAgIGRlZiBnZXRfZm9yY2VkX3JlcGxhY2VtZW50KHNlbGYsIHdvcmRzOiBsaXN0W3N0 cl0sIG53b3JkczogaW50LCB0ZXh0OiBzdHIpIC0+IHR5cGluZy5PcHRpb25hbFtzdHJdOgog ICAgICAgIGV4cGFuZGVkID0gdGV4dAogICAgICAgIGlmIHdvcmRzIGFuZCB3b3Jkc1swXSBp biBbJ2xvYWQnLCAnY2QnLCAnY29tcGRiJywgJ291dHB1dCddOgogICAgICAgICAgICBpZiB0 ZXh0LnN0YXJ0c3dpdGgoJ34nKToKICAgICAgICAgICAgICAgIGV4cGFuZGVkID0gb3MucGF0 aC5leHBhbmR1c2VyKGV4cGFuZGVkKQogICAgICAgICAgICBpZiBub3QgZXhwYW5kZWQuZW5k c3dpdGgoIi8iKSBhbmQgb3MucGF0aC5pc2RpcihleHBhbmRlZCk6CiAgICAgICAgICAgICAg ICBleHBhbmRlZCArPSAiLyIKICAgICAgICByZXR1cm4gZXhwYW5kZWQgaWYgZXhwYW5kZWQg IT0gdGV4dCBlbHNlIE5vbmUKCiAgICBkZWYgZ2V0X2NvbXBsZXRpb25zKHNlbGYsIHdvcmRz OiBsaXN0W3N0cl0sIG53b3JkczogaW50LCB0ZXh0OiBzdHIpIC0+IGxpc3Rbc3RyXToKICAg ICAgICBpZiBud29yZHMgPT0gMDoKICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChIZWxwQ29t bWFuZC5QQVJTRVJTLmtleXMoKSkKCiAgICAgICAgb3B0cyA9IFtdCiAgICAgICAgaWYgdGV4 dC5zdGFydHN3aXRoKCctLScpIG9yIHRleHQgPT0gJycgb3IgdGV4dCA9PSAnLSc6CiAgICAg ICAgICAgICMgdWdseS4uLgogICAgICAgICAgICBvcHRzID0gc29ydGVkKEhlbHBDb21tYW5k LlBBUlNFUlNbd29yZHNbMF1dLl9vcHRpb25fc3RyaW5nX2FjdGlvbnMua2V5cygpKQoKICAg ICAgICBhcmdzID0gW10KICAgICAgICBpZiB3b3Jkc1swXSBpbiBbJ2NhbGxlcnMnLCAnY2Fs bGVlcycsICdrZWVwJywgJ29taXQnLCAnZWRnZSddOgogICAgICAgICAgICAjIGNvbXBsZXRl IGJ5IGZ1bmN0aW9uIG5hbWUKICAgICAgICAgICAgYXJncyA9IHNvcnRlZChzZXQoR1JBUEgu bm9kZXNfYnlfdXNlcm5hbWUua2V5cygpKS51bmlvbihHUkFQSC5ub2Rlcy5rZXlzKCkpKQog ICAgICAgIGVsaWYgd29yZHNbMF0gaW4gWydwd2QnXToKICAgICAgICAgICAgcGFzcwogICAg ICAgIGVsaWYgd29yZHNbMF0gaW4gWydjZCddOgogICAgICAgICAgICAjIGNvbXBsZXRlIGJ5 IGRpcmVjdG9yeSBvbmx5CiAgICAgICAgICAgIGFyZ3MgPSBzb3J0ZWQoZ2xvYi5nbG9iKHRl eHQgKyAnKi8nKSkKICAgICAgICBlbGlmIHdvcmRzWzBdIGluIFsnbG9hZCddOgogICAgICAg ICAgICAjIGNvbXBsZXRlIGJ5IFJUTCBkdW1wLCBvYmplY3QgZmlsZSBvciBkaXJlY3RvcnkK ICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZSh0ZXh0KQogICAgICAgICAgICBh cmdzID0gZ2xvYi5nbG9iKHBhdGggKyAnLypyLmV4cGFuZCcpCiAgICAgICAgICAgIGFyZ3Mg Kz0gZ2xvYi5nbG9iKHBhdGggKyAnLyoubycpCiAgICAgICAgICAgIGFyZ3MgKz0gZ2xvYi5n bG9iKHRleHQgKyAnKi8nKQogICAgICAgICAgICBhcmdzID0gc29ydGVkKGFyZ3MpCiAgICAg ICAgZWxpZiB3b3Jkc1swXSBpbiBbJ2NvbXBkYiddOgogICAgICAgICAgICAjIGNvbXBsZXRl IGJ5IGpzb24gb3IgZGlyZWN0b3J5CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5h bWUodGV4dCkKICAgICAgICAgICAgYXJncyA9IGdsb2IuZ2xvYihwYXRoICsgJy8qLmpzb24n KQogICAgICAgICAgICBhcmdzICs9IGdsb2IuZ2xvYih0ZXh0ICsgJyovJykKICAgICAgICAg ICAgYXJncyA9IHNvcnRlZChhcmdzKQogICAgICAgIGVsaWYgd29yZHNbMF0gaW4gWydvdXRw dXQnXToKICAgICAgICAgICAgIyBjb21wbGV0ZSBieSBhbnkgZmlsZSBuYW1lCiAgICAgICAg ICAgIGFyZ3MgPSBzb3J0ZWQoZ2xvYi5nbG9iKHRleHQgKyAnKicpKQogICAgICAgICAgICBh cmdzID0gW3ggKyAiLyIgaWYgb3MucGF0aC5pc2Rpcih4KSBlbHNlIHggZm9yIHggaW4gYXJn c10KCiAgICAgICAgcmV0dXJuIG9wdHMgKyBhcmdzCgogICAgZGVmIGRpc3BsYXlfbWF0Y2hl cyhzZWxmLCBzdWJzdGl0dXRpb246IHN0ciwgbWF0Y2hlczogdHlwaW5nLlNlcXVlbmNlW3N0 cl0sIGxvbmdlc3RfbWF0Y2hfbGVuZ3RoOiBpbnQpOgogICAgICAgIGxpbmVfYnVmZmVyID0g cmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKICAgICAgICBjb2x1bW5zID0gb3MuZ2V0X3Rl cm1pbmFsX3NpemUoKVswXQoKICAgICAgICBwcmludCgpCgogICAgICAgIGxlbmd0aCA9IGxv bmdlc3RfbWF0Y2hfbGVuZ3RoICogNiAvLyA1ICsgMgogICAgICAgIGJ1ZmZlciA9ICIiCiAg ICAgICAgZm9yIG1hdGNoIGluIG1hdGNoZXM6CiAgICAgICAgICAgIG1hdGNoICs9ICIgIiAq IChsZW5ndGggLSBsZW4obWF0Y2gpKQogICAgICAgICAgICBpZiBsZW4oYnVmZmVyICsgbWF0 Y2gpID4gY29sdW1uczoKICAgICAgICAgICAgICAgIHByaW50KGJ1ZmZlci5yc3RyaXAoKSkK ICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICIiCiAgICAgICAgICAgIGJ1ZmZlciArPSBtYXRj aAoKICAgICAgICBpZiBidWZmZXI6CiAgICAgICAgICAgIHByaW50KGJ1ZmZlcikKCiAgICAg ICAgcHJpbnQoc2VsZi5wcm9tcHQsIGVuZD0iIikKICAgICAgICBwcmludChsaW5lX2J1ZmZl ciwgZW5kPSIiKQogICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQoKCmRlZiBtYWluKCk6CiAg ICBpZiBvcy5wYXRoLmV4aXN0cygiY29tcGlsZV9jb21tYW5kcy5qc29uIik6CiAgICAgICAg cHJpbnQoIkxvYWRpbmcgY29tcGlsZV9jb21tYW5kcy5qc29uIiwgZmlsZT1zeXMuc3RkZXJy KQogICAgICAgIGFyZ3MgPSBQQVJTRVIucGFyc2VfYXJncyhbImNvbXBkYiIsICJjb21waWxl X2NvbW1hbmRzLmpzb24iXSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGFyZ3MuY21kY2xh c3MoKS5ydW4oYXJncykKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAg ICBwcmludCgiQ291bGQgbm90IGxvYWQgY29tcGlsZV9jb21tYW5kcy5qc29uOiIsIGUsIGZp bGU9c3lzLnN0ZGVycikKCiAgICBpZiBvcy5pc2F0dHkoMCk6CiAgICAgICAgaW5mID0gUmVh ZGxpbmVJbnB1dCgiKHZyYykgIikKICAgIGVsc2U6CiAgICAgICAgaW5mID0gc3lzLnN0ZGlu CgogICAgd2hpbGUgVHJ1ZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxpbmUgPSBuZXh0 KGluZikKICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgICAgIGJy ZWFrCiAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgIGJyZWFrCgog ICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgo JyMnKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgYXJndiA9IGxpbmUuc3BsaXQo KQogICAgICAgIGlmIG5vdCBhcmd2OgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHRy eToKICAgICAgICAgICAgYXJncyA9IFBBUlNFUi5wYXJzZV9hcmdzKGFyZ3YpCiAgICAgICAg ICAgIHRyeToKICAgICAgICAgICAgICAgIGFyZ3MuY21kY2xhc3MoKS5ydW4oYXJncykKICAg ICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHByaW50KGUp CiAgICAgICAgZXhjZXB0IGFyZ3BhcnNlLkFyZ3VtZW50RXJyb3IgYXMgZToKICAgICAgICAg ICAgcHJpbnQoc3RyKGUpLCBmaWxlPXN5cy5zdGRlcnIpCgoKZGVmIGluaXRfc3VicGFyc2Vy cygpOgogICAgc3VicGFyc2VycyA9IFBBUlNFUi5hZGRfc3VicGFyc2Vycyh0aXRsZT0ic3Vi Y29tbWFuZHMiLCBoZWxwPU5vbmUpCiAgICBmb3IgY2xzIGluIFZSQ0NvbW1hbmQuX19zdWJj bGFzc2VzX18oKToKICAgICAgICBmb3IgbiBpbiBjbHMuTkFNRTogICMgdHlwZTogaWdub3Jl CiAgICAgICAgICAgIHN1YnAgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIobiwgaGVscD1jbHMu X19kb2NfXywgZXhpdF9vbl9lcnJvcj1GYWxzZSwgYWRkX2hlbHA9RmFsc2UpCiAgICAgICAg ICAgIEhlbHBDb21tYW5kLnJlZ2lzdGVyKG4sIHN1YnApCiAgICAgICAgICAgIGNscy5hcmdz KHN1YnApCiAgICAgICAgICAgIHN1YnAuc2V0X2RlZmF1bHRzKGNtZD1uKQogICAgICAgICAg ICBzdWJwLnNldF9kZWZhdWx0cyhjbWRjbGFzcz1jbHMpCgoKaW5pdF9zdWJwYXJzZXJzKCkK aWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo= --------------PKYQK0aqtVW5NTVXIoA9Qgbu--