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 89F8BC07E9B for ; Sun, 11 Jul 2021 13:20:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 686B7611CB for ; Sun, 11 Jul 2021 13:20:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232789AbhGKNXg convert rfc822-to-8bit (ORCPT ); Sun, 11 Jul 2021 09:23:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:41566 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232868AbhGKNXd (ORCPT ); Sun, 11 Jul 2021 09:23:33 -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 B32BC61186; Sun, 11 Jul 2021 13:20:40 +0000 (UTC) Date: Sun, 11 Jul 2021 14:22:55 +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 v12 12/17] tools/counter: Create Counter tools Message-ID: <20210711142255.725b2f03@jic23-huawei> In-Reply-To: References: X-Mailer: Claws Mail 3.18.0 (GTK+ 2.24.33; 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 Mon, 5 Jul 2021 17:19:00 +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 > --- > MAINTAINERS | 1 + > tools/Makefile | 13 ++--- > tools/counter/Build | 1 + > tools/counter/Makefile | 53 ++++++++++++++++++ > tools/counter/counter_example.c | 95 +++++++++++++++++++++++++++++++++ > 5 files changed, 157 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 5de4d2164844..e96797f57f04 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -4688,6 +4688,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..4c26400ffc03 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 \ > 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..71dfec673c11 > --- /dev/null > +++ b/tools/counter/counter_example.c > @@ -0,0 +1,95 @@ > +// 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 > + > +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); > + if (fd == -1) { > + perror("Unable to open /dev/counter0"); > + return -errno; > + } > + > + ret = ioctl(fd, COUNTER_ADD_WATCH_IOCTL, watches); > + 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 -errno; > + } > + > + 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", > + (unsigned long long)event_data[0].timestamp, I think there should be no need to cast this one. __aligned_u64 is always going to be of type llu anyway. > + (unsigned long long)event_data[0].value, > + strerror(event_data[0].status), > + (unsigned long long)event_data[1].timestamp, > + (unsigned long long)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=-16.2 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 3627CC07E96 for ; Sun, 11 Jul 2021 13:22:53 +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 E43B5611F2 for ; Sun, 11 Jul 2021 13:22:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E43B5611F2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@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=Qn0hLByef06vXL+GCdNPC8pNmPYFeoVLCF655IxQ9vs=; b=bwHJUeRNmTZwHb hS5/IxpFO3YNW88wwtjGUBUqI/O/wpS2Mywm7nwkdUC9k6do24dl8zCWk5BJheWqB+VWyWsJU2BJU SaJgG3ODCZxlhLCOUbjdJgwr8tNqoPt4cq6Ft4rIFA7+K5QaeH9FQ3fQ6bV/10CR3YNvrvq7QdTTm 3gOhW+YPyRVE5FMk6sjHYyxZTSV0LJbroWvVoulnDAgaiDA0ilu84IZHfPtsQhcz82VRGJkLTwoaU dMdo7BWRWB2qjZ80IcS5yOKh8L3hYfwt4leA9Kw8rLRasxSePakR8w5K7gUzn9PsOad3M9wl9+G5L 35YnlhG1JVw4aq1eVZkw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m2ZO8-0055kY-3w; Sun, 11 Jul 2021 13:20:52 +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 1m2ZO3-0055jy-N0 for linux-arm-kernel@lists.infradead.org; Sun, 11 Jul 2021 13:20:49 +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 B32BC61186; Sun, 11 Jul 2021 13:20:40 +0000 (UTC) Date: Sun, 11 Jul 2021 14:22:55 +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 v12 12/17] tools/counter: Create Counter tools Message-ID: <20210711142255.725b2f03@jic23-huawei> In-Reply-To: References: X-Mailer: Claws Mail 3.18.0 (GTK+ 2.24.33; 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-20210711_062047_833830_2122A7FF X-CRM114-Status: GOOD ( 29.22 ) 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 T24gTW9uLCAgNSBKdWwgMjAyMSAxNzoxOTowMCArMDkwMApXaWxsaWFtIEJyZWF0aGl0dCBHcmF5 IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPiB3cm90ZToKCj4gVGhpcyBjcmVhdGVzIGFuIGV4YW1w bGUgQ291bnRlciBwcm9ncmFtIHVuZGVyIHRvb2xzL2NvdW50ZXIvKgo+IHRvIGV4ZW1wbGlmeSB0 aGUgQ291bnRlciBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZS4KPiAKPiBDYzogUGF2ZWwgTWFj aGVrIDxwYXZlbEB1Y3cuY3o+Cj4gU2lnbmVkLW9mZi1ieTogV2lsbGlhbSBCcmVhdGhpdHQgR3Jh eSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4KPiAtLS0KPiAgTUFJTlRBSU5FUlMgICAgICAgICAg ICAgICAgICAgICB8ICAxICsKPiAgdG9vbHMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICB8IDEz ICsrLS0tCj4gIHRvb2xzL2NvdW50ZXIvQnVpbGQgICAgICAgICAgICAgfCAgMSArCj4gIHRvb2xz L2NvdW50ZXIvTWFrZWZpbGUgICAgICAgICAgfCA1MyArKysrKysrKysrKysrKysrKysKPiAgdG9v bHMvY291bnRlci9jb3VudGVyX2V4YW1wbGUuYyB8IDk1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwo+ICA1IGZpbGVzIGNoYW5nZWQsIDE1NyBpbnNlcnRpb25zKCspLCA2IGRlbGV0 aW9ucygtKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvY291bnRlci9CdWlsZAo+ICBjcmVh dGUgbW9kZSAxMDA2NDQgdG9vbHMvY291bnRlci9NYWtlZmlsZQo+ICBjcmVhdGUgbW9kZSAxMDA2 NDQgdG9vbHMvY291bnRlci9jb3VudGVyX2V4YW1wbGUuYwo+IAo+IGRpZmYgLS1naXQgYS9NQUlO VEFJTkVSUyBiL01BSU5UQUlORVJTCj4gaW5kZXggNWRlNGQyMTY0ODQ0Li5lOTY3OTdmNTdmMDQg MTAwNjQ0Cj4gLS0tIGEvTUFJTlRBSU5FUlMKPiArKysgYi9NQUlOVEFJTkVSUwo+IEBAIC00Njg4 LDYgKzQ2ODgsNyBAQCBGOglEb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZ2VuZXJpYy1jb3VudGVy LnJzdAo+ICBGOglkcml2ZXJzL2NvdW50ZXIvCj4gIEY6CWluY2x1ZGUvbGludXgvY291bnRlci5o Cj4gIEY6CWluY2x1ZGUvdWFwaS9saW51eC9jb3VudGVyLmgKPiArRjoJdG9vbHMvY291bnRlci8K PiAgCj4gIENQMjYxNSBJMkMgRFJJVkVSCj4gIE06CUJlbmNlIENzw7Nrw6FzIDxiZW5jZTk4QHNj aC5ibWUuaHU+Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlIGIvdG9vbHMvTWFrZWZpbGUK PiBpbmRleCA3ZTlkMzRkZGQ3NGMuLjRjMjY0MDBmZmMwMyAxMDA2NDQKPiAtLS0gYS90b29scy9N YWtlZmlsZQo+ICsrKyBiL3Rvb2xzL01ha2VmaWxlCj4gQEAgLTEyLDYgKzEyLDcgQEAgaGVscDoK PiAgCUBlY2hvICcgIGFjcGkgICAgICAgICAgICAgICAgICAgLSBBQ1BJIHRvb2xzJwo+ICAJQGVj aG8gJyAgYnBmICAgICAgICAgICAgICAgICAgICAtIG1pc2MgQlBGIHRvb2xzJwo+ICAJQGVjaG8g JyAgY2dyb3VwICAgICAgICAgICAgICAgICAtIGNncm91cCB0b29scycKPiArCUBlY2hvICcgIGNv dW50ZXIgICAgICAgICAgICAgICAgLSBDb3VudGVyIHRvb2xzJwo+ICAJQGVjaG8gJyAgY3B1cG93 ZXIgICAgICAgICAgICAgICAtIGEgdG9vbCBmb3IgYWxsIHRoaW5ncyB4ODYgQ1BVIHBvd2VyJwo+ ICAJQGVjaG8gJyAgZGVidWdnaW5nICAgICAgICAgICAgICAtIHRvb2xzIGZvciBkZWJ1Z2dpbmcn Cj4gIAlAZWNobyAnICBmaXJld2lyZSAgICAgICAgICAgICAgIC0gdGhlIHVzZXJzcGFjZSBwYXJ0 IG9mIG5vc3ksIGFuIElFRUUtMTM5NCB0cmFmZmljIHNuaWZmZXInCj4gQEAgLTY1LDcgKzY2LDcg QEAgYWNwaTogRk9SQ0UKPiAgY3B1cG93ZXI6IEZPUkNFCj4gIAkkKGNhbGwgZGVzY2VuZCxwb3dl ci8kQCkKPiAgCj4gLWNncm91cCBmaXJld2lyZSBodiBndWVzdCBib290Y29uZmlnIHNwaSB1c2Ig dmlydGlvIHZtIGJwZiBpaW8gZ3BpbyBvYmp0b29sIGxlZHMgd21pIHBjaSBmaXJtd2FyZSBkZWJ1 Z2dpbmcgdHJhY2luZzogRk9SQ0UKPiArY2dyb3VwIGNvdW50ZXIgZmlyZXdpcmUgaHYgZ3Vlc3Qg Ym9vdGNvbmZpZyBzcGkgdXNiIHZpcnRpbyB2bSBicGYgaWlvIGdwaW8gb2JqdG9vbCBsZWRzIHdt aSBwY2kgZmlybXdhcmUgZGVidWdnaW5nIHRyYWNpbmc6IEZPUkNFCj4gIAkkKGNhbGwgZGVzY2Vu ZCwkQCkKPiAgCj4gIGJwZi8lOiBGT1JDRQo+IEBAIC0xMDAsNyArMTAxLDcgQEAgZnJlZWZhbGw6 IEZPUkNFCj4gIGt2bV9zdGF0OiBGT1JDRQo+ICAJJChjYWxsIGRlc2NlbmQsa3ZtLyRAKQo+ICAK PiAtYWxsOiBhY3BpIGNncm91cCBjcHVwb3dlciBncGlvIGh2IGZpcmV3aXJlIGxpYmxvY2tkZXAg XAo+ICthbGw6IGFjcGkgY2dyb3VwIGNvdW50ZXIgY3B1cG93ZXIgZ3BpbyBodiBmaXJld2lyZSBs aWJsb2NrZGVwIFwKPiAgCQlwZXJmIHNlbGZ0ZXN0cyBib290Y29uZmlnIHNwaSB0dXJib3N0YXQg dXNiIFwKPiAgCQl2aXJ0aW8gdm0gYnBmIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kgXAo+ICAJCXRt b24gZnJlZWZhbGwgaWlvIG9ianRvb2wga3ZtX3N0YXQgd21pIFwKPiBAQCAtMTEyLDcgKzExMyw3 IEBAIGFjcGlfaW5zdGFsbDoKPiAgY3B1cG93ZXJfaW5zdGFsbDoKPiAgCSQoY2FsbCBkZXNjZW5k LHBvd2VyLyQoQDpfaW5zdGFsbD0pLGluc3RhbGwpCj4gIAo+IC1jZ3JvdXBfaW5zdGFsbCBmaXJl d2lyZV9pbnN0YWxsIGdwaW9faW5zdGFsbCBodl9pbnN0YWxsIGlpb19pbnN0YWxsIHBlcmZfaW5z dGFsbCBib290Y29uZmlnX2luc3RhbGwgc3BpX2luc3RhbGwgdXNiX2luc3RhbGwgdmlydGlvX2lu c3RhbGwgdm1faW5zdGFsbCBicGZfaW5zdGFsbCBvYmp0b29sX2luc3RhbGwgd21pX2luc3RhbGwg cGNpX2luc3RhbGwgZGVidWdnaW5nX2luc3RhbGwgdHJhY2luZ19pbnN0YWxsOgo+ICtjZ3JvdXBf aW5zdGFsbCBjb3VudGVyX2luc3RhbGwgZmlyZXdpcmVfaW5zdGFsbCBncGlvX2luc3RhbGwgaHZf aW5zdGFsbCBpaW9faW5zdGFsbCBwZXJmX2luc3RhbGwgYm9vdGNvbmZpZ19pbnN0YWxsIHNwaV9p bnN0YWxsIHVzYl9pbnN0YWxsIHZpcnRpb19pbnN0YWxsIHZtX2luc3RhbGwgYnBmX2luc3RhbGwg b2JqdG9vbF9pbnN0YWxsIHdtaV9pbnN0YWxsIHBjaV9pbnN0YWxsIGRlYnVnZ2luZ19pbnN0YWxs IHRyYWNpbmdfaW5zdGFsbDoKPiAgCSQoY2FsbCBkZXNjZW5kLCQoQDpfaW5zdGFsbD0pLGluc3Rh bGwpCj4gIAo+ICBsaWJsb2NrZGVwX2luc3RhbGw6Cj4gQEAgLTEzMyw3ICsxMzQsNyBAQCBmcmVl ZmFsbF9pbnN0YWxsOgo+ICBrdm1fc3RhdF9pbnN0YWxsOgo+ICAJJChjYWxsIGRlc2NlbmQsa3Zt LyQoQDpfaW5zdGFsbD0pLGluc3RhbGwpCj4gIAo+IC1pbnN0YWxsOiBhY3BpX2luc3RhbGwgY2dy b3VwX2luc3RhbGwgY3B1cG93ZXJfaW5zdGFsbCBncGlvX2luc3RhbGwgXAo+ICtpbnN0YWxsOiBh Y3BpX2luc3RhbGwgY2dyb3VwX2luc3RhbGwgY291bnRlcl9pbnN0YWxsIGNwdXBvd2VyX2luc3Rh bGwgZ3Bpb19pbnN0YWxsIFwKPiAgCQlodl9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgaWlvX2lu c3RhbGwgbGlibG9ja2RlcF9pbnN0YWxsIFwKPiAgCQlwZXJmX2luc3RhbGwgc2VsZnRlc3RzX2lu c3RhbGwgdHVyYm9zdGF0X2luc3RhbGwgdXNiX2luc3RhbGwgXAo+ICAJCXZpcnRpb19pbnN0YWxs IHZtX2luc3RhbGwgYnBmX2luc3RhbGwgeDg2X2VuZXJneV9wZXJmX3BvbGljeV9pbnN0YWxsIFwK PiBAQCAtMTQ3LDcgKzE0OCw3IEBAIGFjcGlfY2xlYW46Cj4gIGNwdXBvd2VyX2NsZWFuOgo+ICAJ JChjYWxsIGRlc2NlbmQscG93ZXIvY3B1cG93ZXIsY2xlYW4pCj4gIAo+IC1jZ3JvdXBfY2xlYW4g aHZfY2xlYW4gZmlyZXdpcmVfY2xlYW4gYm9vdGNvbmZpZ19jbGVhbiBzcGlfY2xlYW4gdXNiX2Ns ZWFuIHZpcnRpb19jbGVhbiB2bV9jbGVhbiB3bWlfY2xlYW4gYnBmX2NsZWFuIGlpb19jbGVhbiBn cGlvX2NsZWFuIG9ianRvb2xfY2xlYW4gbGVkc19jbGVhbiBwY2lfY2xlYW4gZmlybXdhcmVfY2xl YW4gZGVidWdnaW5nX2NsZWFuIHRyYWNpbmdfY2xlYW46Cj4gK2Nncm91cF9jbGVhbiBjb3VudGVy X2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIGJvb3Rjb25maWdfY2xlYW4gc3BpX2NsZWFu IHVzYl9jbGVhbiB2aXJ0aW9fY2xlYW4gdm1fY2xlYW4gd21pX2NsZWFuIGJwZl9jbGVhbiBpaW9f Y2xlYW4gZ3Bpb19jbGVhbiBvYmp0b29sX2NsZWFuIGxlZHNfY2xlYW4gcGNpX2NsZWFuIGZpcm13 YXJlX2NsZWFuIGRlYnVnZ2luZ19jbGVhbiB0cmFjaW5nX2NsZWFuOgo+ICAJJChjYWxsIGRlc2Nl bmQsJChAOl9jbGVhbj0pLGNsZWFuKQo+ICAKPiAgbGlibG9ja2RlcF9jbGVhbjoKPiBAQCAtMTgx LDcgKzE4Miw3IEBAIGZyZWVmYWxsX2NsZWFuOgo+ICBidWlsZF9jbGVhbjoKPiAgCSQoY2FsbCBk ZXNjZW5kLGJ1aWxkLGNsZWFuKQo+ICAKPiAtY2xlYW46IGFjcGlfY2xlYW4gY2dyb3VwX2NsZWFu IGNwdXBvd2VyX2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIFwKPiArY2xlYW46IGFjcGlf Y2xlYW4gY2dyb3VwX2NsZWFuIGNvdW50ZXJfY2xlYW4gY3B1cG93ZXJfY2xlYW4gaHZfY2xlYW4g ZmlyZXdpcmVfY2xlYW4gXAo+ICAJCXBlcmZfY2xlYW4gc2VsZnRlc3RzX2NsZWFuIHR1cmJvc3Rh dF9jbGVhbiBib290Y29uZmlnX2NsZWFuIHNwaV9jbGVhbiB1c2JfY2xlYW4gdmlydGlvX2NsZWFu IFwKPiAgCQl2bV9jbGVhbiBicGZfY2xlYW4gaWlvX2NsZWFuIHg4Nl9lbmVyZ3lfcGVyZl9wb2xp Y3lfY2xlYW4gdG1vbl9jbGVhbiBcCj4gIAkJZnJlZWZhbGxfY2xlYW4gYnVpbGRfY2xlYW4gbGli YnBmX2NsZWFuIGxpYnN1YmNtZF9jbGVhbiBsaWJsb2NrZGVwX2NsZWFuIFwKPiBkaWZmIC0tZ2l0 IGEvdG9vbHMvY291bnRlci9CdWlsZCBiL3Rvb2xzL2NvdW50ZXIvQnVpbGQKPiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMzNmNGE1MWQ3MTVlCj4gLS0tIC9kZXYv bnVsbAo+ICsrKyBiL3Rvb2xzL2NvdW50ZXIvQnVpbGQKPiBAQCAtMCwwICsxIEBACj4gK2NvdW50 ZXJfZXhhbXBsZS15ICs9IGNvdW50ZXJfZXhhbXBsZS5vCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2Nv dW50ZXIvTWFrZWZpbGUgYi90b29scy9jb3VudGVyL01ha2VmaWxlCj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjVlYmMxOTVmZDljMAo+IC0tLSAvZGV2L251bGwK PiArKysgYi90b29scy9jb3VudGVyL01ha2VmaWxlCj4gQEAgLTAsMCArMSw1MyBAQAo+ICsjIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gK2luY2x1ZGUgLi4vc2NyaXB0cy9NYWtl ZmlsZS5pbmNsdWRlCj4gKwo+ICtiaW5kaXIgPz0gL3Vzci9iaW4KPiArCj4gK2lmZXEgKCQoc3Jj dHJlZSksKQo+ICtzcmN0cmVlIDo9ICQocGF0c3Vic3QgJS8sJSwkKGRpciAkKENVUkRJUikpKQo+ ICtzcmN0cmVlIDo9ICQocGF0c3Vic3QgJS8sJSwkKGRpciAkKHNyY3RyZWUpKSkKPiArZW5kaWYK PiArCj4gKyMgRG8gbm90IHVzZSBtYWtlJ3MgYnVpbHQtaW4gcnVsZXMKPiArIyAodGhpcyBpbXBy b3ZlcyBwZXJmb3JtYW5jZSBhbmQgYXZvaWRzIGhhcmQtdG8tZGVidWcgYmVoYXZpb3VyKTsKPiAr TUFLRUZMQUdTICs9IC1yCj4gKwo+ICtvdmVycmlkZSBDRkxBR1MgKz0gLU8yIC1XYWxsIC1nIC1E X0dOVV9TT1VSQ0UgLUkkKE9VVFBVVClpbmNsdWRlCj4gKwo+ICtBTExfVEFSR0VUUyA6PSBjb3Vu dGVyX2V4YW1wbGUKPiArQUxMX1BST0dSQU1TIDo9ICQocGF0c3Vic3QgJSwkKE9VVFBVVCklLCQo QUxMX1RBUkdFVFMpKQo+ICsKPiArYWxsOiAkKEFMTF9QUk9HUkFNUykKPiArCj4gK2V4cG9ydCBz cmN0cmVlIE9VVFBVVCBDQyBMRCBDRkxBR1MKPiAraW5jbHVkZSAkKHNyY3RyZWUpL3Rvb2xzL2J1 aWxkL01ha2VmaWxlLmluY2x1ZGUKPiArCj4gKyMKPiArIyBXZSBuZWVkIHRoZSBmb2xsb3dpbmcg dG8gYmUgb3V0c2lkZSBvZiBrZXJuZWwgdHJlZQo+ICsjCj4gKyQoT1VUUFVUKWluY2x1ZGUvbGlu dXgvY291bnRlci5oOiAuLi8uLi9pbmNsdWRlL3VhcGkvbGludXgvY291bnRlci5oCj4gKwlta2Rp ciAtcCAkKE9VVFBVVClpbmNsdWRlL2xpbnV4IDI+JjEgfHwgdHJ1ZQo+ICsJbG4gLXNmICQoQ1VS RElSKS8uLi8uLi9pbmNsdWRlL3VhcGkvbGludXgvY291bnRlci5oICRACj4gKwo+ICtwcmVwYXJl OiAkKE9VVFBVVClpbmNsdWRlL2xpbnV4L2NvdW50ZXIuaAo+ICsKPiArQ09VTlRFUl9FWEFNUExF IDo9ICQoT1VUUFVUKWNvdW50ZXJfZXhhbXBsZS5vCj4gKyQoQ09VTlRFUl9FWEFNUExFKTogcHJl cGFyZSBGT1JDRQo+ICsJJChRKSQoTUFLRSkgJChidWlsZCk9Y291bnRlcl9leGFtcGxlCj4gKyQo T1VUUFVUKWNvdW50ZXJfZXhhbXBsZTogJChDT1VOVEVSX0VYQU1QTEUpCj4gKwkkKFFVSUVUX0xJ TkspJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgJDwgLW8gJEAKPiArCj4gK2NsZWFuOgo+ICsJ cm0gLWYgJChBTExfUFJPR1JBTVMpCj4gKwlybSAtcmYgJChPVVRQVVQpaW5jbHVkZS9saW51eC9j b3VudGVyLmgKPiArCWZpbmQgJChpZiAkKE9VVFBVVCksJChPVVRQVVQpLC4pIC1uYW1lICcqLm8n IC1kZWxldGUgLW8gLW5hbWUgJ1wuKi5kJyAtZGVsZXRlCj4gKwo+ICtpbnN0YWxsOiAkKEFMTF9Q Uk9HUkFNUykKPiArCWluc3RhbGwgLWQgLW0gNzU1ICQoREVTVERJUikkKGJpbmRpcik7CQlcCj4g Kwlmb3IgcHJvZ3JhbSBpbiAkKEFMTF9QUk9HUkFNUyk7IGRvCQlcCj4gKwkJaW5zdGFsbCAkJHBy b2dyYW0gJChERVNURElSKSQoYmluZGlyKTsJXAo+ICsJZG9uZQo+ICsKPiArRk9SQ0U6Cj4gKwo+ ICsuUEhPTlk6IGFsbCBpbnN0YWxsIGNsZWFuIEZPUkNFIHByZXBhcmUKPiBkaWZmIC0tZ2l0IGEv dG9vbHMvY291bnRlci9jb3VudGVyX2V4YW1wbGUuYyBiL3Rvb2xzL2NvdW50ZXIvY291bnRlcl9l eGFtcGxlLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uNzFk ZmVjNjczYzExCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL3Rvb2xzL2NvdW50ZXIvY291bnRlcl9l eGFtcGxlLmMKPiBAQCAtMCwwICsxLDk1IEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wLW9ubHkKPiArLyogQ291bnRlciAtIGV4YW1wbGUgdXNlcnNwYWNlIGFwcGxpY2F0 aW9uCj4gKyAqCj4gKyAqIFRoZSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gb3BlbnMgL2Rldi9jb3Vu dGVyMCwgY29uZmlndXJlcyB0aGUKPiArICogQ09VTlRFUl9FVkVOVF9JTkRFWCBldmVudCBjaGFu bmVsIDAgdG8gZ2F0aGVyIENvdW50IDAgY291bnQgYW5kIENvdW50Cj4gKyAqIDEgY291bnQsIGFu ZCBwcmludHMgb3V0IHRoZSBkYXRhIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIG9uIHRoZQo+ICsg KiBjaGFyYWN0ZXIgZGV2aWNlIG5vZGUuCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAyMSBX aWxsaWFtIEJyZWF0aGl0dCBHcmF5Cj4gKyAqLwo+ICsjaW5jbHVkZSA8ZXJybm8uaD4KPiArI2lu Y2x1ZGUgPGZjbnRsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9jb3VudGVyLmg+Cj4gKyNpbmNsdWRl IDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8c3RyaW5nLmg+Cj4gKyNpbmNsdWRlIDxzeXMvaW9jdGwu aD4KPiArI2luY2x1ZGUgPHVuaXN0ZC5oPgo+ICsKPiArc3RydWN0IGNvdW50ZXJfd2F0Y2ggd2F0 Y2hlc1syXSA9IHsKPiArCXsKPiArCQkvKiBDb21wb25lbnQgZGF0YTogQ291bnQgMCBjb3VudCAq Lwo+ICsJCS5jb21wb25lbnQudHlwZSA9IENPVU5URVJfQ09NUE9ORU5UX0NPVU5ULAo+ICsJCS5j b21wb25lbnQuc2NvcGUgPSBDT1VOVEVSX1NDT1BFX0NPVU5ULAo+ICsJCS5jb21wb25lbnQucGFy ZW50ID0gMCwKPiArCQkvKiBFdmVudCB0eXBlOiBJbmRleCAqLwo+ICsJCS5ldmVudCA9IENPVU5U RVJfRVZFTlRfSU5ERVgsCj4gKwkJLyogRGV2aWNlIGV2ZW50IGNoYW5uZWwgMCAqLwo+ICsJCS5j aGFubmVsID0gMCwKPiArCX0sCj4gKwl7Cj4gKwkJLyogQ29tcG9uZW50IGRhdGE6IENvdW50IDEg Y291bnQgKi8KPiArCQkuY29tcG9uZW50LnR5cGUgPSBDT1VOVEVSX0NPTVBPTkVOVF9DT1VOVCwK PiArCQkuY29tcG9uZW50LnNjb3BlID0gQ09VTlRFUl9TQ09QRV9DT1VOVCwKPiArCQkuY29tcG9u ZW50LnBhcmVudCA9IDEsCj4gKwkJLyogRXZlbnQgdHlwZTogSW5kZXggKi8KPiArCQkuZXZlbnQg PSBDT1VOVEVSX0VWRU5UX0lOREVYLAo+ICsJCS8qIERldmljZSBldmVudCBjaGFubmVsIDAgKi8K PiArCQkuY2hhbm5lbCA9IDAsCj4gKwl9LAo+ICt9Owo+ICsKPiAraW50IG1haW4odm9pZCkKPiAr ewo+ICsJaW50IGZkOwo+ICsJaW50IHJldDsKPiArCXN0cnVjdCBjb3VudGVyX2V2ZW50IGV2ZW50 X2RhdGFbMl07Cj4gKwo+ICsJZmQgPSBvcGVuKCIvZGV2L2NvdW50ZXIwIiwgT19SRFdSKTsKPiAr CWlmIChmZCA9PSAtMSkgewo+ICsJCXBlcnJvcigiVW5hYmxlIHRvIG9wZW4gL2Rldi9jb3VudGVy MCIpOwo+ICsJCXJldHVybiAtZXJybm87Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gaW9jdGwoZmQsIENP VU5URVJfQUREX1dBVENIX0lPQ1RMLCB3YXRjaGVzKTsKPiArCWlmIChyZXQgPT0gLTEpIHsKPiAr CQlwZXJyb3IoIkVycm9yIGFkZGluZyB3YXRjaGVzWzBdIik7Cj4gKwkJcmV0dXJuIC1lcnJubzsK PiArCX0KPiArCXJldCA9IGlvY3RsKGZkLCBDT1VOVEVSX0FERF9XQVRDSF9JT0NUTCwgd2F0Y2hl cyArIDEpOwo+ICsJaWYgKHJldCA9PSAtMSkgewo+ICsJCXBlcnJvcigiRXJyb3IgYWRkaW5nIHdh dGNoZXNbMV0iKTsKPiArCQlyZXR1cm4gLWVycm5vOwo+ICsJfQo+ICsJcmV0ID0gaW9jdGwoZmQs IENPVU5URVJfRU5BQkxFX0VWRU5UU19JT0NUTCk7Cj4gKwlpZiAocmV0ID09IC0xKSB7Cj4gKwkJ cGVycm9yKCJFcnJvciBlbmFibGluZyBldmVudHMiKTsKPiArCQlyZXR1cm4gLWVycm5vOwo+ICsJ fQo+ICsKPiArCWZvciAoOzspIHsKPiArCQlyZXQgPSByZWFkKGZkLCBldmVudF9kYXRhLCBzaXpl b2YoZXZlbnRfZGF0YSkpOwo+ICsJCWlmIChyZXQgPT0gLTEpIHsKPiArCQkJcGVycm9yKCJGYWls ZWQgdG8gcmVhZCBldmVudCBkYXRhIik7Cj4gKwkJCXJldHVybiAtZXJybm87Cj4gKwkJfQo+ICsK PiArCQlpZiAocmV0ICE9IHNpemVvZihldmVudF9kYXRhKSkgewo+ICsJCQlmcHJpbnRmKHN0ZGVy ciwgIkZhaWxlZCB0byByZWFkIGV2ZW50IGRhdGFcbiIpOwo+ICsJCQlyZXR1cm4gLUVJTzsKPiAr CQl9Cj4gKwo+ICsJCXByaW50ZigiVGltZXN0YW1wIDA6ICVsbHVcdENvdW50IDA6ICVsbHVcbiIK PiArCQkgICAgICAgIkVycm9yIE1lc3NhZ2UgMDogJXNcbiIKPiArCQkgICAgICAgIlRpbWVzdGFt cCAxOiAlbGx1XHRDb3VudCAxOiAlbGx1XG4iCj4gKwkJICAgICAgICJFcnJvciBNZXNzYWdlIDE6 ICVzXG4iLAo+ICsJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWV2ZW50X2RhdGFbMF0udGlt ZXN0YW1wLAoKSSB0aGluayB0aGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBjYXN0IHRoaXMgb25l LiAgX19hbGlnbmVkX3U2NCBpcyBhbHdheXMKZ29pbmcgdG8gYmUgb2YgdHlwZSBsbHUgYW55d2F5 LgoKCj4gKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZXZlbnRfZGF0YVswXS52YWx1ZSwK PiArCQkgICAgICAgc3RyZXJyb3IoZXZlbnRfZGF0YVswXS5zdGF0dXMpLAo+ICsJCSAgICAgICAo dW5zaWduZWQgbG9uZyBsb25nKWV2ZW50X2RhdGFbMV0udGltZXN0YW1wLAo+ICsJCSAgICAgICAo dW5zaWduZWQgbG9uZyBsb25nKWV2ZW50X2RhdGFbMV0udmFsdWUsCj4gKwkJICAgICAgIHN0cmVy cm9yKGV2ZW50X2RhdGFbMV0uc3RhdHVzKSk7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30K CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1h cm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5v cmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0t a2VybmVsCg==