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=-15.5 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 autolearn=unavailable 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 472B3C433F5 for ; Sun, 12 Sep 2021 16:23:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2824261076 for ; Sun, 12 Sep 2021 16:23:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233029AbhILQY0 convert rfc822-to-8bit (ORCPT ); Sun, 12 Sep 2021 12:24:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:54088 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229643AbhILQYV (ORCPT ); Sun, 12 Sep 2021 12:24:21 -0400 Received: from jic23-huawei (cpc108967-cmbg20-2-0-cust86.5-4.cable.virginm.net [81.101.6.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8742760F92; Sun, 12 Sep 2021 16:23:02 +0000 (UTC) Date: Sun, 12 Sep 2021 17:26:35 +0100 From: Jonathan Cameron To: William Breathitt Gray Cc: linux-stm32@st-md-mailman.stormreply.com, kernel@pengutronix.de, a.fatoum@pengutronix.de, kamel.bouhara@bootlin.com, gwendal@chromium.org, alexandre.belloni@bootlin.com, david@lechnology.com, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, syednwaris@gmail.com, patrick.havelange@essensium.com, fabrice.gasnier@st.com, mcoquelin.stm32@gmail.com, alexandre.torgue@st.com, o.rempel@pengutronix.de, jarkko.nikula@linux.intel.com, Pavel Machek Subject: Re: [PATCH v16 09/14] tools/counter: Create Counter tools Message-ID: <20210912172635.14cc0923@jic23-huawei> In-Reply-To: <7fb22281fde0874614a87b0a000b2bf27e17043e.1630031207.git.vilhelm.gray@gmail.com> References: <7fb22281fde0874614a87b0a000b2bf27e17043e.1630031207.git.vilhelm.gray@gmail.com> X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 27 Aug 2021 12:47:53 +0900 William Breathitt Gray wrote: > This creates an example Counter program under tools/counter/* > to exemplify the Counter character device interface. > > Cc: Pavel Machek > Signed-off-by: William Breathitt Gray It's great to have this example, but it very much an example rather than a generic tool. You may want to revisit and provide a more generic tool in the future. A trivial comment about using a loop inline. Jonathan > --- > MAINTAINERS | 1 + > tools/Makefile | 13 ++--- > tools/counter/Build | 1 + > tools/counter/Makefile | 53 +++++++++++++++++++ > tools/counter/counter_example.c | 93 +++++++++++++++++++++++++++++++++ > 5 files changed, 155 insertions(+), 6 deletions(-) > create mode 100644 tools/counter/Build > create mode 100644 tools/counter/Makefile > create mode 100644 tools/counter/counter_example.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index f2fdd2202605..57dc9b6ff82a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -4782,6 +4782,7 @@ F: Documentation/driver-api/generic-counter.rst > F: drivers/counter/ > F: include/linux/counter.h > F: include/uapi/linux/counter.h > +F: tools/counter/ > > CP2615 I2C DRIVER > M: Bence Csókás > diff --git a/tools/Makefile b/tools/Makefile > index 7e9d34ddd74c..5da1fde03a9a 100644 > --- a/tools/Makefile > +++ b/tools/Makefile > @@ -12,6 +12,7 @@ help: > @echo ' acpi - ACPI tools' > @echo ' bpf - misc BPF tools' > @echo ' cgroup - cgroup tools' > + @echo ' counter - counter tools' > @echo ' cpupower - a tool for all things x86 CPU power' > @echo ' debugging - tools for debugging' > @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' > @@ -65,7 +66,7 @@ acpi: FORCE > cpupower: FORCE > $(call descend,power/$@) > > -cgroup firewire hv guest bootconfig spi usb virtio vm bpf iio gpio objtool leds wmi pci firmware debugging tracing: FORCE > +cgroup counter firewire hv guest bootconfig spi usb virtio vm bpf iio gpio objtool leds wmi pci firmware debugging tracing: FORCE > $(call descend,$@) > > bpf/%: FORCE > @@ -100,7 +101,7 @@ freefall: FORCE > kvm_stat: FORCE > $(call descend,kvm/$@) > > -all: acpi cgroup cpupower gpio hv firewire liblockdep \ > +all: acpi cgroup counter cpupower gpio hv firewire liblockdep \ > perf selftests bootconfig spi turbostat usb \ > virtio vm bpf x86_energy_perf_policy \ > tmon freefall iio objtool kvm_stat wmi \ > @@ -112,7 +113,7 @@ acpi_install: > cpupower_install: > $(call descend,power/$(@:_install=),install) > > -cgroup_install firewire_install gpio_install hv_install iio_install perf_install bootconfig_install spi_install usb_install virtio_install vm_install bpf_install objtool_install wmi_install pci_install debugging_install tracing_install: > +cgroup_install counter_install firewire_install gpio_install hv_install iio_install perf_install bootconfig_install spi_install usb_install virtio_install vm_install bpf_install objtool_install wmi_install pci_install debugging_install tracing_install: > $(call descend,$(@:_install=),install) > > liblockdep_install: > @@ -133,7 +134,7 @@ freefall_install: > kvm_stat_install: > $(call descend,kvm/$(@:_install=),install) > > -install: acpi_install cgroup_install cpupower_install gpio_install \ > +install: acpi_install cgroup_install counter_install cpupower_install gpio_install \ > hv_install firewire_install iio_install liblockdep_install \ > perf_install selftests_install turbostat_install usb_install \ > virtio_install vm_install bpf_install x86_energy_perf_policy_install \ > @@ -147,7 +148,7 @@ acpi_clean: > cpupower_clean: > $(call descend,power/cpupower,clean) > > -cgroup_clean hv_clean firewire_clean bootconfig_clean spi_clean usb_clean virtio_clean vm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean pci_clean firmware_clean debugging_clean tracing_clean: > +cgroup_clean counter_clean hv_clean firewire_clean bootconfig_clean spi_clean usb_clean virtio_clean vm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean pci_clean firmware_clean debugging_clean tracing_clean: > $(call descend,$(@:_clean=),clean) > > liblockdep_clean: > @@ -181,7 +182,7 @@ freefall_clean: > build_clean: > $(call descend,build,clean) > > -clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean \ > +clean: acpi_clean cgroup_clean counter_clean cpupower_clean hv_clean firewire_clean \ This is far from alphabetical, though I have no idea if there is any strong convention on where to add new entries. > perf_clean selftests_clean turbostat_clean bootconfig_clean spi_clean usb_clean virtio_clean \ > vm_clean bpf_clean iio_clean x86_energy_perf_policy_clean tmon_clean \ > freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean \ > diff --git a/tools/counter/Build b/tools/counter/Build > new file mode 100644 > index 000000000000..33f4a51d715e > --- /dev/null > +++ b/tools/counter/Build > @@ -0,0 +1 @@ > +counter_example-y += counter_example.o > diff --git a/tools/counter/Makefile b/tools/counter/Makefile > new file mode 100644 > index 000000000000..5ebc195fd9c0 > --- /dev/null > +++ b/tools/counter/Makefile > @@ -0,0 +1,53 @@ > +# SPDX-License-Identifier: GPL-2.0 > +include ../scripts/Makefile.include > + > +bindir ?= /usr/bin > + > +ifeq ($(srctree),) > +srctree := $(patsubst %/,%,$(dir $(CURDIR))) > +srctree := $(patsubst %/,%,$(dir $(srctree))) > +endif > + > +# Do not use make's built-in rules > +# (this improves performance and avoids hard-to-debug behaviour); > +MAKEFLAGS += -r > + > +override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include > + > +ALL_TARGETS := counter_example > +ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS)) > + > +all: $(ALL_PROGRAMS) > + > +export srctree OUTPUT CC LD CFLAGS > +include $(srctree)/tools/build/Makefile.include > + > +# > +# We need the following to be outside of kernel tree > +# > +$(OUTPUT)include/linux/counter.h: ../../include/uapi/linux/counter.h > + mkdir -p $(OUTPUT)include/linux 2>&1 || true > + ln -sf $(CURDIR)/../../include/uapi/linux/counter.h $@ > + > +prepare: $(OUTPUT)include/linux/counter.h > + > +COUNTER_EXAMPLE := $(OUTPUT)counter_example.o > +$(COUNTER_EXAMPLE): prepare FORCE > + $(Q)$(MAKE) $(build)=counter_example > +$(OUTPUT)counter_example: $(COUNTER_EXAMPLE) > + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ > + > +clean: > + rm -f $(ALL_PROGRAMS) > + rm -rf $(OUTPUT)include/linux/counter.h > + find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete > + > +install: $(ALL_PROGRAMS) > + install -d -m 755 $(DESTDIR)$(bindir); \ > + for program in $(ALL_PROGRAMS); do \ > + install $$program $(DESTDIR)$(bindir); \ > + done > + > +FORCE: > + > +.PHONY: all install clean FORCE prepare > diff --git a/tools/counter/counter_example.c b/tools/counter/counter_example.c > new file mode 100644 > index 000000000000..90d69fb9463b > --- /dev/null > +++ b/tools/counter/counter_example.c > @@ -0,0 +1,93 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* Counter - example userspace application > + * > + * The userspace application opens /dev/counter0, configures the > + * COUNTER_EVENT_INDEX event channel 0 to gather Count 0 count and Count > + * 1 count, and prints out the data as it becomes available on the > + * character device node. > + * > + * Copyright (C) 2021 William Breathitt Gray > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +static struct counter_watch watches[2] = { > + { > + /* Component data: Count 0 count */ > + .component.type = COUNTER_COMPONENT_COUNT, > + .component.scope = COUNTER_SCOPE_COUNT, > + .component.parent = 0, > + /* Event type: Index */ > + .event = COUNTER_EVENT_INDEX, > + /* Device event channel 0 */ > + .channel = 0, > + }, > + { > + /* Component data: Count 1 count */ > + .component.type = COUNTER_COMPONENT_COUNT, > + .component.scope = COUNTER_SCOPE_COUNT, > + .component.parent = 1, > + /* Event type: Index */ > + .event = COUNTER_EVENT_INDEX, > + /* Device event channel 0 */ > + .channel = 0, > + }, > +}; > + > +int main(void) > +{ > + int fd; > + int ret; > + struct counter_event event_data[2]; > + > + fd = open("/dev/counter0", O_RDWR); You may want to make this tool more flexible at somepoint. It is in tools rather than Documentation after all. > + if (fd == -1) { > + perror("Unable to open /dev/counter0"); > + return -errno; > + } > + > + ret = ioctl(fd, COUNTER_ADD_WATCH_IOCTL, watches); Loop? > + if (ret == -1) { > + perror("Error adding watches[0]"); > + return -errno; > + } > + ret = ioctl(fd, COUNTER_ADD_WATCH_IOCTL, watches + 1); > + if (ret == -1) { > + perror("Error adding watches[1]"); > + return -errno; > + } > + ret = ioctl(fd, COUNTER_ENABLE_EVENTS_IOCTL); > + if (ret == -1) { > + perror("Error enabling events"); > + return -errno; > + } > + > + for (;;) { > + ret = read(fd, event_data, sizeof(event_data)); > + if (ret == -1) { > + perror("Failed to read event data"); > + return 1; > + } > + > + if (ret != sizeof(event_data)) { > + fprintf(stderr, "Failed to read event data\n"); > + return -EIO; > + } > + > + printf("Timestamp 0: %llu\tCount 0: %llu\n" > + "Error Message 0: %s\n" > + "Timestamp 1: %llu\tCount 1: %llu\n" > + "Error Message 1: %s\n", > + event_data[0].timestamp, event_data[0].value, > + strerror(event_data[0].status), > + event_data[1].timestamp, event_data[1].value, > + strerror(event_data[1].status)); > + } > + > + return 0; > +} 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=-15.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 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 27F80C433F5 for ; Sun, 12 Sep 2021 16:24:47 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 D887361076 for ; Sun, 12 Sep 2021 16:24:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org D887361076 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=dNc/DGqDxQ6GxXOfS6v/MfFricj/lq3vYfzxunbM0WQ=; b=URxRYFSKu50y08 ZTBax0lP3BA3vVvABkQUZJ44fEh0OYs/eFzUtMrQFkKqg153fB018TncCM3QnzofaMAtwqICdRalF gueKaD3nlJDpIKaBEx08WB8o4FQOkq0C7iQ53E/CEW8pRLE35rIcaeIrzliuCVmEy/2iA62j2Oqwk tqvyzZMau7IBMP1Xo/xIIIhKeie/dhXK2EqEFEQ8IdTkoTK0vNWGtfIKVOkWWPNJlbTUAfsdIgPyn OKNBMvlrIUK1u/UHUGkl7fb+7HpQiwyMcq56sanKd6HexZhRUeTx9UtP98qVMIFHzGDZDndorDc0/ aMt3mriT4c1Vd2I9Q4rg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mPSG7-00GiIH-Gs; Sun, 12 Sep 2021 16:23:11 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mPSG3-00GiHl-Sl for linux-arm-kernel@lists.infradead.org; Sun, 12 Sep 2021 16:23:09 +0000 Received: from jic23-huawei (cpc108967-cmbg20-2-0-cust86.5-4.cable.virginm.net [81.101.6.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8742760F92; Sun, 12 Sep 2021 16:23:02 +0000 (UTC) Date: Sun, 12 Sep 2021 17:26:35 +0100 From: Jonathan Cameron To: William Breathitt Gray Cc: linux-stm32@st-md-mailman.stormreply.com, kernel@pengutronix.de, a.fatoum@pengutronix.de, kamel.bouhara@bootlin.com, gwendal@chromium.org, alexandre.belloni@bootlin.com, david@lechnology.com, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, syednwaris@gmail.com, patrick.havelange@essensium.com, fabrice.gasnier@st.com, mcoquelin.stm32@gmail.com, alexandre.torgue@st.com, o.rempel@pengutronix.de, jarkko.nikula@linux.intel.com, Pavel Machek Subject: Re: [PATCH v16 09/14] tools/counter: Create Counter tools Message-ID: <20210912172635.14cc0923@jic23-huawei> In-Reply-To: <7fb22281fde0874614a87b0a000b2bf27e17043e.1630031207.git.vilhelm.gray@gmail.com> References: <7fb22281fde0874614a87b0a000b2bf27e17043e.1630031207.git.vilhelm.gray@gmail.com> X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210912_092308_015631_A37D60A6 X-CRM114-Status: GOOD ( 31.38 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gRnJpLCAyNyBBdWcgMjAyMSAxMjo0Nzo1MyArMDkwMApXaWxsaWFtIEJyZWF0aGl0dCBHcmF5 IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPiB3cm90ZToKCj4gVGhpcyBjcmVhdGVzIGFuIGV4YW1w bGUgQ291bnRlciBwcm9ncmFtIHVuZGVyIHRvb2xzL2NvdW50ZXIvKgo+IHRvIGV4ZW1wbGlmeSB0 aGUgQ291bnRlciBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZS4KPiAKPiBDYzogUGF2ZWwgTWFj aGVrIDxwYXZlbEB1Y3cuY3o+Cj4gU2lnbmVkLW9mZi1ieTogV2lsbGlhbSBCcmVhdGhpdHQgR3Jh eSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4KCkl0J3MgZ3JlYXQgdG8gaGF2ZSB0aGlzIGV4YW1w bGUsIGJ1dCBpdCB2ZXJ5IG11Y2ggYW4gZXhhbXBsZSByYXRoZXIgdGhhbgphIGdlbmVyaWMgdG9v bC4gWW91IG1heSB3YW50IHRvIHJldmlzaXQgYW5kIHByb3ZpZGUgYSBtb3JlIGdlbmVyaWMKdG9v bCBpbiB0aGUgZnV0dXJlLgoKQSB0cml2aWFsIGNvbW1lbnQgYWJvdXQgdXNpbmcgYSBsb29wIGlu bGluZS4KCkpvbmF0aGFuCgo+IC0tLQo+ICBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAg IHwgIDEgKwo+ICB0b29scy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgIHwgMTMgKystLS0KPiAg dG9vbHMvY291bnRlci9CdWlsZCAgICAgICAgICAgICB8ICAxICsKPiAgdG9vbHMvY291bnRlci9N YWtlZmlsZSAgICAgICAgICB8IDUzICsrKysrKysrKysrKysrKysrKysKPiAgdG9vbHMvY291bnRl ci9jb3VudGVyX2V4YW1wbGUuYyB8IDkzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Kwo+ICA1IGZpbGVzIGNoYW5nZWQsIDE1NSBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQo+ ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvY291bnRlci9CdWlsZAo+ICBjcmVhdGUgbW9kZSAx MDA2NDQgdG9vbHMvY291bnRlci9NYWtlZmlsZQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMv Y291bnRlci9jb3VudGVyX2V4YW1wbGUuYwo+IAo+IGRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBi L01BSU5UQUlORVJTCj4gaW5kZXggZjJmZGQyMjAyNjA1Li41N2RjOWI2ZmY4MmEgMTAwNjQ0Cj4g LS0tIGEvTUFJTlRBSU5FUlMKPiArKysgYi9NQUlOVEFJTkVSUwo+IEBAIC00NzgyLDYgKzQ3ODIs NyBAQCBGOglEb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZ2VuZXJpYy1jb3VudGVyLnJzdAo+ICBG Oglkcml2ZXJzL2NvdW50ZXIvCj4gIEY6CWluY2x1ZGUvbGludXgvY291bnRlci5oCj4gIEY6CWlu Y2x1ZGUvdWFwaS9saW51eC9jb3VudGVyLmgKPiArRjoJdG9vbHMvY291bnRlci8KPiAgCj4gIENQ MjYxNSBJMkMgRFJJVkVSCj4gIE06CUJlbmNlIENzw7Nrw6FzIDxiZW5jZTk4QHNjaC5ibWUuaHU+ Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlIGIvdG9vbHMvTWFrZWZpbGUKPiBpbmRleCA3 ZTlkMzRkZGQ3NGMuLjVkYTFmZGUwM2E5YSAxMDA2NDQKPiAtLS0gYS90b29scy9NYWtlZmlsZQo+ ICsrKyBiL3Rvb2xzL01ha2VmaWxlCj4gQEAgLTEyLDYgKzEyLDcgQEAgaGVscDoKPiAgCUBlY2hv ICcgIGFjcGkgICAgICAgICAgICAgICAgICAgLSBBQ1BJIHRvb2xzJwo+ICAJQGVjaG8gJyAgYnBm ICAgICAgICAgICAgICAgICAgICAtIG1pc2MgQlBGIHRvb2xzJwo+ICAJQGVjaG8gJyAgY2dyb3Vw ICAgICAgICAgICAgICAgICAtIGNncm91cCB0b29scycKPiArCUBlY2hvICcgIGNvdW50ZXIgICAg ICAgICAgICAgICAgLSBjb3VudGVyIHRvb2xzJwo+ICAJQGVjaG8gJyAgY3B1cG93ZXIgICAgICAg ICAgICAgICAtIGEgdG9vbCBmb3IgYWxsIHRoaW5ncyB4ODYgQ1BVIHBvd2VyJwo+ICAJQGVjaG8g JyAgZGVidWdnaW5nICAgICAgICAgICAgICAtIHRvb2xzIGZvciBkZWJ1Z2dpbmcnCj4gIAlAZWNo byAnICBmaXJld2lyZSAgICAgICAgICAgICAgIC0gdGhlIHVzZXJzcGFjZSBwYXJ0IG9mIG5vc3ks IGFuIElFRUUtMTM5NCB0cmFmZmljIHNuaWZmZXInCj4gQEAgLTY1LDcgKzY2LDcgQEAgYWNwaTog Rk9SQ0UKPiAgY3B1cG93ZXI6IEZPUkNFCj4gIAkkKGNhbGwgZGVzY2VuZCxwb3dlci8kQCkKPiAg Cj4gLWNncm91cCBmaXJld2lyZSBodiBndWVzdCBib290Y29uZmlnIHNwaSB1c2IgdmlydGlvIHZt IGJwZiBpaW8gZ3BpbyBvYmp0b29sIGxlZHMgd21pIHBjaSBmaXJtd2FyZSBkZWJ1Z2dpbmcgdHJh Y2luZzogRk9SQ0UKPiArY2dyb3VwIGNvdW50ZXIgZmlyZXdpcmUgaHYgZ3Vlc3QgYm9vdGNvbmZp ZyBzcGkgdXNiIHZpcnRpbyB2bSBicGYgaWlvIGdwaW8gb2JqdG9vbCBsZWRzIHdtaSBwY2kgZmly bXdhcmUgZGVidWdnaW5nIHRyYWNpbmc6IEZPUkNFCj4gIAkkKGNhbGwgZGVzY2VuZCwkQCkKPiAg Cj4gIGJwZi8lOiBGT1JDRQo+IEBAIC0xMDAsNyArMTAxLDcgQEAgZnJlZWZhbGw6IEZPUkNFCj4g IGt2bV9zdGF0OiBGT1JDRQo+ICAJJChjYWxsIGRlc2NlbmQsa3ZtLyRAKQo+ICAKPiAtYWxsOiBh Y3BpIGNncm91cCBjcHVwb3dlciBncGlvIGh2IGZpcmV3aXJlIGxpYmxvY2tkZXAgXAo+ICthbGw6 IGFjcGkgY2dyb3VwIGNvdW50ZXIgY3B1cG93ZXIgZ3BpbyBodiBmaXJld2lyZSBsaWJsb2NrZGVw IFwKPiAgCQlwZXJmIHNlbGZ0ZXN0cyBib290Y29uZmlnIHNwaSB0dXJib3N0YXQgdXNiIFwKPiAg CQl2aXJ0aW8gdm0gYnBmIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kgXAo+ICAJCXRtb24gZnJlZWZh bGwgaWlvIG9ianRvb2wga3ZtX3N0YXQgd21pIFwKPiBAQCAtMTEyLDcgKzExMyw3IEBAIGFjcGlf aW5zdGFsbDoKPiAgY3B1cG93ZXJfaW5zdGFsbDoKPiAgCSQoY2FsbCBkZXNjZW5kLHBvd2VyLyQo QDpfaW5zdGFsbD0pLGluc3RhbGwpCj4gIAo+IC1jZ3JvdXBfaW5zdGFsbCBmaXJld2lyZV9pbnN0 YWxsIGdwaW9faW5zdGFsbCBodl9pbnN0YWxsIGlpb19pbnN0YWxsIHBlcmZfaW5zdGFsbCBib290 Y29uZmlnX2luc3RhbGwgc3BpX2luc3RhbGwgdXNiX2luc3RhbGwgdmlydGlvX2luc3RhbGwgdm1f aW5zdGFsbCBicGZfaW5zdGFsbCBvYmp0b29sX2luc3RhbGwgd21pX2luc3RhbGwgcGNpX2luc3Rh bGwgZGVidWdnaW5nX2luc3RhbGwgdHJhY2luZ19pbnN0YWxsOgo+ICtjZ3JvdXBfaW5zdGFsbCBj b3VudGVyX2luc3RhbGwgZmlyZXdpcmVfaW5zdGFsbCBncGlvX2luc3RhbGwgaHZfaW5zdGFsbCBp aW9faW5zdGFsbCBwZXJmX2luc3RhbGwgYm9vdGNvbmZpZ19pbnN0YWxsIHNwaV9pbnN0YWxsIHVz Yl9pbnN0YWxsIHZpcnRpb19pbnN0YWxsIHZtX2luc3RhbGwgYnBmX2luc3RhbGwgb2JqdG9vbF9p bnN0YWxsIHdtaV9pbnN0YWxsIHBjaV9pbnN0YWxsIGRlYnVnZ2luZ19pbnN0YWxsIHRyYWNpbmdf aW5zdGFsbDoKPiAgCSQoY2FsbCBkZXNjZW5kLCQoQDpfaW5zdGFsbD0pLGluc3RhbGwpCj4gIAo+ ICBsaWJsb2NrZGVwX2luc3RhbGw6Cj4gQEAgLTEzMyw3ICsxMzQsNyBAQCBmcmVlZmFsbF9pbnN0 YWxsOgo+ICBrdm1fc3RhdF9pbnN0YWxsOgo+ICAJJChjYWxsIGRlc2NlbmQsa3ZtLyQoQDpfaW5z dGFsbD0pLGluc3RhbGwpCj4gIAo+IC1pbnN0YWxsOiBhY3BpX2luc3RhbGwgY2dyb3VwX2luc3Rh bGwgY3B1cG93ZXJfaW5zdGFsbCBncGlvX2luc3RhbGwgXAo+ICtpbnN0YWxsOiBhY3BpX2luc3Rh bGwgY2dyb3VwX2luc3RhbGwgY291bnRlcl9pbnN0YWxsIGNwdXBvd2VyX2luc3RhbGwgZ3Bpb19p bnN0YWxsIFwKPiAgCQlodl9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgaWlvX2luc3RhbGwgbGli bG9ja2RlcF9pbnN0YWxsIFwKPiAgCQlwZXJmX2luc3RhbGwgc2VsZnRlc3RzX2luc3RhbGwgdHVy Ym9zdGF0X2luc3RhbGwgdXNiX2luc3RhbGwgXAo+ICAJCXZpcnRpb19pbnN0YWxsIHZtX2luc3Rh bGwgYnBmX2luc3RhbGwgeDg2X2VuZXJneV9wZXJmX3BvbGljeV9pbnN0YWxsIFwKPiBAQCAtMTQ3 LDcgKzE0OCw3IEBAIGFjcGlfY2xlYW46Cj4gIGNwdXBvd2VyX2NsZWFuOgo+ICAJJChjYWxsIGRl c2NlbmQscG93ZXIvY3B1cG93ZXIsY2xlYW4pCj4gIAo+IC1jZ3JvdXBfY2xlYW4gaHZfY2xlYW4g ZmlyZXdpcmVfY2xlYW4gYm9vdGNvbmZpZ19jbGVhbiBzcGlfY2xlYW4gdXNiX2NsZWFuIHZpcnRp b19jbGVhbiB2bV9jbGVhbiB3bWlfY2xlYW4gYnBmX2NsZWFuIGlpb19jbGVhbiBncGlvX2NsZWFu IG9ianRvb2xfY2xlYW4gbGVkc19jbGVhbiBwY2lfY2xlYW4gZmlybXdhcmVfY2xlYW4gZGVidWdn aW5nX2NsZWFuIHRyYWNpbmdfY2xlYW46Cj4gK2Nncm91cF9jbGVhbiBjb3VudGVyX2NsZWFuIGh2 X2NsZWFuIGZpcmV3aXJlX2NsZWFuIGJvb3Rjb25maWdfY2xlYW4gc3BpX2NsZWFuIHVzYl9jbGVh biB2aXJ0aW9fY2xlYW4gdm1fY2xlYW4gd21pX2NsZWFuIGJwZl9jbGVhbiBpaW9fY2xlYW4gZ3Bp b19jbGVhbiBvYmp0b29sX2NsZWFuIGxlZHNfY2xlYW4gcGNpX2NsZWFuIGZpcm13YXJlX2NsZWFu IGRlYnVnZ2luZ19jbGVhbiB0cmFjaW5nX2NsZWFuOgo+ICAJJChjYWxsIGRlc2NlbmQsJChAOl9j bGVhbj0pLGNsZWFuKQo+ICAKPiAgbGlibG9ja2RlcF9jbGVhbjoKPiBAQCAtMTgxLDcgKzE4Miw3 IEBAIGZyZWVmYWxsX2NsZWFuOgo+ICBidWlsZF9jbGVhbjoKPiAgCSQoY2FsbCBkZXNjZW5kLGJ1 aWxkLGNsZWFuKQo+ICAKPiAtY2xlYW46IGFjcGlfY2xlYW4gY2dyb3VwX2NsZWFuIGNwdXBvd2Vy X2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIFwKPiArY2xlYW46IGFjcGlfY2xlYW4gY2dy b3VwX2NsZWFuIGNvdW50ZXJfY2xlYW4gY3B1cG93ZXJfY2xlYW4gaHZfY2xlYW4gZmlyZXdpcmVf Y2xlYW4gXAoKVGhpcyBpcyBmYXIgZnJvbSBhbHBoYWJldGljYWwsIHRob3VnaCBJIGhhdmUgbm8g aWRlYSBpZiB0aGVyZSBpcyBhbnkgc3Ryb25nIGNvbnZlbnRpb24gb24gd2hlcmUKdG8gYWRkIG5l dyBlbnRyaWVzLgoKPiAgCQlwZXJmX2NsZWFuIHNlbGZ0ZXN0c19jbGVhbiB0dXJib3N0YXRfY2xl YW4gYm9vdGNvbmZpZ19jbGVhbiBzcGlfY2xlYW4gdXNiX2NsZWFuIHZpcnRpb19jbGVhbiBcCj4g IAkJdm1fY2xlYW4gYnBmX2NsZWFuIGlpb19jbGVhbiB4ODZfZW5lcmd5X3BlcmZfcG9saWN5X2Ns ZWFuIHRtb25fY2xlYW4gXAo+ICAJCWZyZWVmYWxsX2NsZWFuIGJ1aWxkX2NsZWFuIGxpYmJwZl9j bGVhbiBsaWJzdWJjbWRfY2xlYW4gbGlibG9ja2RlcF9jbGVhbiBcCj4gZGlmZiAtLWdpdCBhL3Rv b2xzL2NvdW50ZXIvQnVpbGQgYi90b29scy9jb3VudGVyL0J1aWxkCj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjMzZjRhNTFkNzE1ZQo+IC0tLSAvZGV2L251bGwK PiArKysgYi90b29scy9jb3VudGVyL0J1aWxkCj4gQEAgLTAsMCArMSBAQAo+ICtjb3VudGVyX2V4 YW1wbGUteSArPSBjb3VudGVyX2V4YW1wbGUubwo+IGRpZmYgLS1naXQgYS90b29scy9jb3VudGVy L01ha2VmaWxlIGIvdG9vbHMvY291bnRlci9NYWtlZmlsZQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi41ZWJjMTk1ZmQ5YzAKPiAtLS0gL2Rldi9udWxsCj4gKysr IGIvdG9vbHMvY291bnRlci9NYWtlZmlsZQo+IEBAIC0wLDAgKzEsNTMgQEAKPiArIyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICtpbmNsdWRlIC4uL3NjcmlwdHMvTWFrZWZpbGUu aW5jbHVkZQo+ICsKPiArYmluZGlyID89IC91c3IvYmluCj4gKwo+ICtpZmVxICgkKHNyY3RyZWUp LCkKPiArc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChDVVJESVIpKSkKPiArc3Jj dHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzcmN0cmVlKSkpCj4gK2VuZGlmCj4gKwo+ ICsjIERvIG5vdCB1c2UgbWFrZSdzIGJ1aWx0LWluIHJ1bGVzCj4gKyMgKHRoaXMgaW1wcm92ZXMg cGVyZm9ybWFuY2UgYW5kIGF2b2lkcyBoYXJkLXRvLWRlYnVnIGJlaGF2aW91cik7Cj4gK01BS0VG TEFHUyArPSAtcgo+ICsKPiArb3ZlcnJpZGUgQ0ZMQUdTICs9IC1PMiAtV2FsbCAtZyAtRF9HTlVf U09VUkNFIC1JJChPVVRQVVQpaW5jbHVkZQo+ICsKPiArQUxMX1RBUkdFVFMgOj0gY291bnRlcl9l eGFtcGxlCj4gK0FMTF9QUk9HUkFNUyA6PSAkKHBhdHN1YnN0ICUsJChPVVRQVVQpJSwkKEFMTF9U QVJHRVRTKSkKPiArCj4gK2FsbDogJChBTExfUFJPR1JBTVMpCj4gKwo+ICtleHBvcnQgc3JjdHJl ZSBPVVRQVVQgQ0MgTEQgQ0ZMQUdTCj4gK2luY2x1ZGUgJChzcmN0cmVlKS90b29scy9idWlsZC9N YWtlZmlsZS5pbmNsdWRlCj4gKwo+ICsjCj4gKyMgV2UgbmVlZCB0aGUgZm9sbG93aW5nIHRvIGJl IG91dHNpZGUgb2Yga2VybmVsIHRyZWUKPiArIwo+ICskKE9VVFBVVClpbmNsdWRlL2xpbnV4L2Nv dW50ZXIuaDogLi4vLi4vaW5jbHVkZS91YXBpL2xpbnV4L2NvdW50ZXIuaAo+ICsJbWtkaXIgLXAg JChPVVRQVVQpaW5jbHVkZS9saW51eCAyPiYxIHx8IHRydWUKPiArCWxuIC1zZiAkKENVUkRJUikv Li4vLi4vaW5jbHVkZS91YXBpL2xpbnV4L2NvdW50ZXIuaCAkQAo+ICsKPiArcHJlcGFyZTogJChP VVRQVVQpaW5jbHVkZS9saW51eC9jb3VudGVyLmgKPiArCj4gK0NPVU5URVJfRVhBTVBMRSA6PSAk KE9VVFBVVCljb3VudGVyX2V4YW1wbGUubwo+ICskKENPVU5URVJfRVhBTVBMRSk6IHByZXBhcmUg Rk9SQ0UKPiArCSQoUSkkKE1BS0UpICQoYnVpbGQpPWNvdW50ZXJfZXhhbXBsZQo+ICskKE9VVFBV VCljb3VudGVyX2V4YW1wbGU6ICQoQ09VTlRFUl9FWEFNUExFKQo+ICsJJChRVUlFVF9MSU5LKSQo Q0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQ8IC1vICRACj4gKwo+ICtjbGVhbjoKPiArCXJtIC1m ICQoQUxMX1BST0dSQU1TKQo+ICsJcm0gLXJmICQoT1VUUFVUKWluY2x1ZGUvbGludXgvY291bnRl ci5oCj4gKwlmaW5kICQoaWYgJChPVVRQVVQpLCQoT1VUUFVUKSwuKSAtbmFtZSAnKi5vJyAtZGVs ZXRlIC1vIC1uYW1lICdcLiouZCcgLWRlbGV0ZQo+ICsKPiAraW5zdGFsbDogJChBTExfUFJPR1JB TVMpCj4gKwlpbnN0YWxsIC1kIC1tIDc1NSAkKERFU1RESVIpJChiaW5kaXIpOwkJXAo+ICsJZm9y IHByb2dyYW0gaW4gJChBTExfUFJPR1JBTVMpOyBkbwkJXAo+ICsJCWluc3RhbGwgJCRwcm9ncmFt ICQoREVTVERJUikkKGJpbmRpcik7CVwKPiArCWRvbmUKPiArCj4gK0ZPUkNFOgo+ICsKPiArLlBI T05ZOiBhbGwgaW5zdGFsbCBjbGVhbiBGT1JDRSBwcmVwYXJlCj4gZGlmZiAtLWdpdCBhL3Rvb2xz L2NvdW50ZXIvY291bnRlcl9leGFtcGxlLmMgYi90b29scy9jb3VudGVyL2NvdW50ZXJfZXhhbXBs ZS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjkwZDY5ZmI5 NDYzYgo+IC0tLSAvZGV2L251bGwKPiArKysgYi90b29scy9jb3VudGVyL2NvdW50ZXJfZXhhbXBs ZS5jCj4gQEAgLTAsMCArMSw5MyBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMC1vbmx5Cj4gKy8qIENvdW50ZXIgLSBleGFtcGxlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbgo+ ICsgKgo+ICsgKiBUaGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIG9wZW5zIC9kZXYvY291bnRlcjAs IGNvbmZpZ3VyZXMgdGhlCj4gKyAqIENPVU5URVJfRVZFTlRfSU5ERVggZXZlbnQgY2hhbm5lbCAw IHRvIGdhdGhlciBDb3VudCAwIGNvdW50IGFuZCBDb3VudAo+ICsgKiAxIGNvdW50LCBhbmQgcHJp bnRzIG91dCB0aGUgZGF0YSBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZSBvbiB0aGUKPiArICogY2hh cmFjdGVyIGRldmljZSBub2RlLgo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjEgV2lsbGlh bSBCcmVhdGhpdHQgR3JheQo+ICsgKi8KPiArI2luY2x1ZGUgPGVycm5vLmg+Cj4gKyNpbmNsdWRl IDxmY250bC5oPgo+ICsjaW5jbHVkZSA8bGludXgvY291bnRlci5oPgo+ICsjaW5jbHVkZSA8c3Rk aW8uaD4KPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4g KyNpbmNsdWRlIDx1bmlzdGQuaD4KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgY291bnRlcl93YXRjaCB3 YXRjaGVzWzJdID0gewo+ICsJewo+ICsJCS8qIENvbXBvbmVudCBkYXRhOiBDb3VudCAwIGNvdW50 ICovCj4gKwkJLmNvbXBvbmVudC50eXBlID0gQ09VTlRFUl9DT01QT05FTlRfQ09VTlQsCj4gKwkJ LmNvbXBvbmVudC5zY29wZSA9IENPVU5URVJfU0NPUEVfQ09VTlQsCj4gKwkJLmNvbXBvbmVudC5w YXJlbnQgPSAwLAo+ICsJCS8qIEV2ZW50IHR5cGU6IEluZGV4ICovCj4gKwkJLmV2ZW50ID0gQ09V TlRFUl9FVkVOVF9JTkRFWCwKPiArCQkvKiBEZXZpY2UgZXZlbnQgY2hhbm5lbCAwICovCj4gKwkJ LmNoYW5uZWwgPSAwLAo+ICsJfSwKPiArCXsKPiArCQkvKiBDb21wb25lbnQgZGF0YTogQ291bnQg MSBjb3VudCAqLwo+ICsJCS5jb21wb25lbnQudHlwZSA9IENPVU5URVJfQ09NUE9ORU5UX0NPVU5U LAo+ICsJCS5jb21wb25lbnQuc2NvcGUgPSBDT1VOVEVSX1NDT1BFX0NPVU5ULAo+ICsJCS5jb21w b25lbnQucGFyZW50ID0gMSwKPiArCQkvKiBFdmVudCB0eXBlOiBJbmRleCAqLwo+ICsJCS5ldmVu dCA9IENPVU5URVJfRVZFTlRfSU5ERVgsCj4gKwkJLyogRGV2aWNlIGV2ZW50IGNoYW5uZWwgMCAq Lwo+ICsJCS5jaGFubmVsID0gMCwKPiArCX0sCj4gK307Cj4gKwo+ICtpbnQgbWFpbih2b2lkKQo+ ICt7Cj4gKwlpbnQgZmQ7Cj4gKwlpbnQgcmV0Owo+ICsJc3RydWN0IGNvdW50ZXJfZXZlbnQgZXZl bnRfZGF0YVsyXTsKPiArCj4gKwlmZCA9IG9wZW4oIi9kZXYvY291bnRlcjAiLCBPX1JEV1IpOwoK WW91IG1heSB3YW50IHRvIG1ha2UgdGhpcyB0b29sIG1vcmUgZmxleGlibGUgYXQgc29tZXBvaW50 LiBJdCBpcwppbiB0b29scyByYXRoZXIgdGhhbiBEb2N1bWVudGF0aW9uIGFmdGVyIGFsbC4KCj4g KwlpZiAoZmQgPT0gLTEpIHsKPiArCQlwZXJyb3IoIlVuYWJsZSB0byBvcGVuIC9kZXYvY291bnRl cjAiKTsKPiArCQlyZXR1cm4gLWVycm5vOwo+ICsJfQo+ICsKPiArCXJldCA9IGlvY3RsKGZkLCBD T1VOVEVSX0FERF9XQVRDSF9JT0NUTCwgd2F0Y2hlcyk7CgpMb29wPwoKPiArCWlmIChyZXQgPT0g LTEpIHsKPiArCQlwZXJyb3IoIkVycm9yIGFkZGluZyB3YXRjaGVzWzBdIik7Cj4gKwkJcmV0dXJu IC1lcnJubzsKPiArCX0KPiArCXJldCA9IGlvY3RsKGZkLCBDT1VOVEVSX0FERF9XQVRDSF9JT0NU TCwgd2F0Y2hlcyArIDEpOwo+ICsJaWYgKHJldCA9PSAtMSkgewo+ICsJCXBlcnJvcigiRXJyb3Ig YWRkaW5nIHdhdGNoZXNbMV0iKTsKPiArCQlyZXR1cm4gLWVycm5vOwo+ICsJfQo+ICsJcmV0ID0g aW9jdGwoZmQsIENPVU5URVJfRU5BQkxFX0VWRU5UU19JT0NUTCk7Cj4gKwlpZiAocmV0ID09IC0x KSB7Cj4gKwkJcGVycm9yKCJFcnJvciBlbmFibGluZyBldmVudHMiKTsKPiArCQlyZXR1cm4gLWVy cm5vOwo+ICsJfQo+ICsKPiArCWZvciAoOzspIHsKPiArCQlyZXQgPSByZWFkKGZkLCBldmVudF9k YXRhLCBzaXplb2YoZXZlbnRfZGF0YSkpOwo+ICsJCWlmIChyZXQgPT0gLTEpIHsKPiArCQkJcGVy cm9yKCJGYWlsZWQgdG8gcmVhZCBldmVudCBkYXRhIik7Cj4gKwkJCXJldHVybiAxOwo+ICsJCX0K PiArCj4gKwkJaWYgKHJldCAhPSBzaXplb2YoZXZlbnRfZGF0YSkpIHsKPiArCQkJZnByaW50Zihz dGRlcnIsICJGYWlsZWQgdG8gcmVhZCBldmVudCBkYXRhXG4iKTsKPiArCQkJcmV0dXJuIC1FSU87 Cj4gKwkJfQo+ICsKPiArCQlwcmludGYoIlRpbWVzdGFtcCAwOiAlbGx1XHRDb3VudCAwOiAlbGx1 XG4iCj4gKwkJICAgICAgICJFcnJvciBNZXNzYWdlIDA6ICVzXG4iCj4gKwkJICAgICAgICJUaW1l c3RhbXAgMTogJWxsdVx0Q291bnQgMTogJWxsdVxuIgo+ICsJCSAgICAgICAiRXJyb3IgTWVzc2Fn ZSAxOiAlc1xuIiwKPiArCQkgICAgICAgZXZlbnRfZGF0YVswXS50aW1lc3RhbXAsIGV2ZW50X2Rh dGFbMF0udmFsdWUsCj4gKwkJICAgICAgIHN0cmVycm9yKGV2ZW50X2RhdGFbMF0uc3RhdHVzKSwK PiArCQkgICAgICAgZXZlbnRfZGF0YVsxXS50aW1lc3RhbXAsIGV2ZW50X2RhdGFbMV0udmFsdWUs Cj4gKwkJICAgICAgIHN0cmVycm9yKGV2ZW50X2RhdGFbMV0uc3RhdHVzKSk7Cj4gKwl9Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVs QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==