From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lekensteyn.nl ([178.21.112.251]:39797 "EHLO lekensteyn.nl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752480AbeCEVUj (ORCPT ); Mon, 5 Mar 2018 16:20:39 -0500 Date: Mon, 5 Mar 2018 21:58:31 +0100 From: Peter Wu To: Lukas Wunner Cc: dri-devel@lists.freedesktop.org, Alex Deucher , nouveau@lists.freedesktop.org, Imre Deak , Maik Freudenberg , Raphael Doursenaud , Martin Lopatar , Daniel Drake , Denis Lisov , zigarrre@gmail.com, "Rafael J. Wysocki" , Bjorn Helgaas , linux-pci@vger.kernel.org Subject: Re: [PATCH v2 0/7] Modernize vga_switcheroo by using device link for HDA Message-ID: <20180305205831.GA1397@al> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: Sender: linux-pci-owner@vger.kernel.org List-ID: Hi Lukas, Sorry for the delay, I finally found some time to reviewd and test the patches and found some issues (some of them might already be present in v4.15 without your patches though, I did not try). Test environment: - Branch switcheroo_devlink_v2 (commit v4.15-20-gb33d50c5c6ad) - Laptop: Clevo P651RA (nouveau uses PR3), lspci: 00:01.0 PCI bridge [0604]: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16) [8086:1901] (rev 07) 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM204M [GeForce GTX 965M] [10de:13d9] (rev a1) 01:00.1 Audio device [0403]: NVIDIA Corporation GM204 High Definition Audio Controller [10de:0fbb] (rev a1) - Distribution: Arch Linux x86_64 - Tested from (1) console and (2) Xorg 1.19.3-2 (Openbox) - Booted with HDMI cable connected and nouveau/snd-hda-intel unloaded. To check the runtime PM status, I used this "rpm-status" script: grep --color . /sys/bus/pci/devices/0000:00:01.0/{0000:01:00.0/,0000:01:00.1/,}power/control grep --color . /sys/bus/pci/devices/0000:00:01.0/{0000:01:00.0/,0000:01:00.1/,}power/runtime_{enabled,usage,active_kids,status} To test audio output (via HDMI; DP port does not seem to support audio): speaker-test -Dhdmi:CARD=NVidia,DEV=0 -c2 Below I first list some issues, then some good news. Issue 1 - GPU does not suspend on text console. When present at the text console and an external monitor is connected through HDMI or DP, the RPM counter is 1. Only when the cable is removed (or when "echo off > /sys/class/drm/card1-HDMI-A-1/status"), the RPM count drops to 0 and the GPU device suspends. When Xorg is started (startx), the RPM counter also drops to 0 though. Issue 2 - RPM counter for audio function drops below 0 on system sleep. When both nouveau and snd-hda-intel are loaded and a HDMI (or DP?) cable is connected, the RPM counter becomes one after suspend/resume. This happens both with text console and Xorg. Issue 3 - invalid PCI config reads to audio device if disconnected. When no HDMI/DP cable is connected, the HDMI audio function will be inaccessible after runtime/system resume. Assume nouveau loaded before s/r, then loading snd-hda-intel will fail with: 0]: pam_unix(sudo:session): session closed for user root hdaudio hdaudioC1D0: no AFG or MFG node found hdaudio hdaudioC1D1: no AFG or MFG node found hdaudio hdaudioC1D2: no AFG or MFG node found hdaudio hdaudioC1D3: no AFG or MFG node found hdaudio hdaudioC1D4: no AFG or MFG node found hdaudio hdaudioC1D5: no AFG or MFG node found hdaudio hdaudioC1D6: no AFG or MFG node found hdaudio hdaudioC1D7: no AFG or MFG node found snd_hda_intel 0000:01:00.1: no codecs initialized After rmmod snd-hda-intel and system suspend/resume: pci 0000:01:00.1: restoring config space at offset 0x3c (was 0xffffffff, writing 0x200) pci 0000:01:00.1: restoring config space at offset 0x38 (was 0xffffffff, writing 0x0) pci 0000:01:00.1: restoring config space at offset 0x34 (was 0xffffffff, writing 0x60) This persists until removing both PCI devices and rescanning the root port. (When no HDMI/DP cable is connected, the audio function will not appear; remove+rescan is required to recover.) Issue 4 - runtime_active_kids leak with audio function. After the above issue, the audio device never entered the suspended state even though the runtime_usage counter reached 0. It turned out that runtime_active_kids was 4. Every time snd-hda-intel is loaded (and fails to initialize due to the above issue), this counter is increased. Issue 5 - audio breaks after system sleep or stopping Xorg. When Xorg is stopped or the system sleep/resumes while speaker-test is active (e.g. in GNU screen), audio stops playing and speaker-test exits. Issue 6 - wrong pin status reported / no audio (Possibly "working as expected" since audio is tied to GPU function.) Scenario: HDMI cable is connected but GPU is unused ("echo off > /sys/class/drm/card1-HDMI-1-1/status" from console or with "xrandr --output HDMI-A-1 --off"). hdajacksensetest reports no HDMI pin presence even if connected, dmesg reports: nouveau 0000:01:00.0: DRM: DDC responded, but no EDID for HDMI-A-1 Using "speaker-test", the program does not fail but no sound can be heard either. Issue 7 - nouveau: warning after unloading after stopping Xorg (Issue in nouveau, likely not related to this patch set.) After "xrandr --output HDMI-1-1 --mode 2560x1440" in Xorg, stopping Xorg (and possibly "echo off > /sys/class/drm/card1-HDMI-A-1/status"), removing nouveau triggered: WARNING: CPU: 7 PID: 5475 at drivers/gpu/drm/drm_mode_config.c:439 drm_mode_config_cleanup+0x1fa/0x260 CPU: 7 PID: 5475 Comm: rmmod Not tainted 4.15.0testing-00020-gb33d50c5c6ad #55 RIP: 0010:drm_mode_config_cleanup+0x1fa/0x260 [..] Call Trace: nouveau_display_destroy+0x41/0x80 [nouveau] nouveau_drm_unload+0x6b/0xd0 [nouveau] drm_dev_unregister+0x3c/0xe0 drm_put_dev+0x2e/0x60 nouveau_drm_device_remove+0x37/0x50 [nouveau] pci_device_remove+0x36/0xb0 device_release_driver_internal+0x160/0x230 driver_detach+0x3a/0x70 bus_remove_driver+0x58/0xd0 pci_unregister_driver+0x3b/0x90 nouveau_drm_exit+0x15/0x432 [nouveau] SyS_delete_module+0x16c/0x230 Issue 8 - acpi: sleeping function in atomic context. (Issue is likely not related to this patch set.) At some point I also got a BUG, nouveau was already unloaded and I ran: "echo 1 | tee /sys/bus/pci/devices/0000:01:00.{0,1}/remove" BUG: sleeping function called from invalid context at /home/peter/linux/mm/slab.h:419 in_atomic(): 1, irqs_disabled(): 0, pid: 4844, name: kworker/3:4 INFO: lockdep is turned off. CPU: 3 PID: 4844 Comm: kworker/3:4 Tainted: G W 4.15.0testing-00020-gb33d50c5c6ad #55 Hardware name: Notebook P65_P67RGRERA/P65_P67RGRERA, BIOS 1.05.16 05/16/2016 Workqueue: events_power_efficient srcu_invoke_callbacks Call Trace: dump_stack+0x5f/0x86 ___might_sleep+0x20c/0x240 kmem_cache_alloc_trace+0x4d/0x230 acpi_ut_evaluate_object+0x68/0x23c ? srcu_invoke_callbacks+0xa2/0x150 acpi_rs_get_prt_method_data+0x42/0xa2 acpi_get_irq_routing_table+0x70/0x9f ? __slab_free+0x11c/0x380 acpi_pci_irq_find_prt_entry+0x83/0x330 ? srcu_invoke_callbacks+0xa2/0x150 acpi_pci_irq_lookup+0x27/0x2e0 acpi_pci_irq_disable+0x45/0xb0 pci_release_dev+0x29/0x60 device_release+0x2d/0x80 kobject_put+0xb7/0x190 __device_link_free_srcu+0x32/0x40 srcu_invoke_callbacks+0xba/0x150 process_one_work+0x273/0x670 worker_thread+0x4a/0x400 kthread+0x100/0x140 ? process_one_work+0x670/0x670 ? kthread_create_worker_on_cpu+0x50/0x50 ? do_syscall_64+0x56/0x1a0 ? SyS_exit_group+0x10/0x10 Issue 9 - potential memory corruption. At some point (possibly after issue 7, but I am not fully sure), I saw an artifact in the text console which would persist even when switching between consoles. It was gone after system sleep/resume. If I remember correctly, it looked like something from a Xorg session which I killed before. That was the bad news, the good news: - Loading nouveau and snd-hda-intel (in any order) while RPM is enabled and the port was in D3cold works. - RPM interaction between audio and GPU seems good, when audio resumes, the GPU RPM counter increments, when audio suspends it decrements. - As the GPU enters D3cold, I can observe significant power savings through /sys/class/power_supply/BAT0/ (no regressions here). - In a default configuration I have no audio function (see also nouveau bug https://bugs.freedesktop.org/show_bug.cgi?id=75985) so most of the above issues should not occur. Hope it helps, and if desired you can add: Tested-by: Peter Wu For the following patches, you can also add my Reviewed-by: vga_switcheroo: Update PCI current_state on power change vga_switcheroo: Deduplicate power state tracking vga_switcheroo: Use device link for HDA controller vga_switcheroo: Let HDA autosuspend on mux change drm/nouveau: Runtime suspend despite HDA being unbound The two other PCI patches look fine as well. Kind regards, Peter On Sat, Mar 03, 2018 at 10:53:24AM +0100, Lukas Wunner wrote: > Modernize vga_switcheroo by using a device link to enforce a runtime PM > dependency from an HDA controller to the GPU it's integrated into, v2. > > Changes since v1: > > - Replace patch [1/7] to use pci_save_state() / pci_restore_state() > for consistency between runtime PM code path of bound and unbound > devices. (Rafael, Bjorn) > > - Patch [5/7]: Drop an unnecessary initialization. (Bjorn) > Rephrase error message on failed link addition for clarity. > > Link to v1: > https://www.spinics.net/lists/dri-devel/msg165889.html > > Testing on more machines would be greatly appreciated, particularly > Nvidia Optimus or AMD PowerXpress. > > The series is based on 4.16-rc3. To test it on 4.15, you need to > cherry-pick 7506dc798993 and 2fa6d6cdaf28. For your convenience > I've pushed a 4.15-based branch to: > https://github.com/l1k/linux/commits/switcheroo_devlink_v2 > > Minimal test procedure: > > - Note well: Recent Optimus require that a Mini-DP or HDMI cable is > plugged in on boot for the HDA device to be present. > > - Check that HDA, GPU and root port autosuspend when not in use: > cat /sys/bus/pci/devices/0000:01:00.1/power/runtime_status # HDA > cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status # GPU > cat /sys/bus/pci/devices/0000:00:01.0/power/runtime_status # Root Port > > - Check that all three autoresume when accessing the HDA: > hdajacksensetest -c 1 > > - Unbind the HDA controller: > echo 0000:01:00.1 > /sys/bus/pci/drivers/snd_hda_intel/unbind > Wait for GPU to power off, then rebind the HDA controller: > echo 0000:01:00.1 > /sys/bus/pci/drivers/snd_hda_intel/bind > Check dmesg for errors, try accessing HDA with hdajacksensetest. > > - If your laptop uses the root port's _PR3 to cut power to the GPU: > Unbind the GPU: > echo 0000:01:00.0 > /sys/bus/pci/drivers/{nouveau,amdgpu,radeon}/unbind > Allow runtime PM on the GPU: > echo auto > /sys/bus/pci/devices/0000:01:00.0/power/control > Wait for GPU to power off, then rebind it: > echo 0000:01:00.0 > /sys/bus/pci/drivers/{nouveau,amdgpu,radeon}/bind > Check dmesg for errors. If you see any then we may need to perform > further actions in pci_pm_runtime_resume(), see patch [1/7]. > > Thanks, > > Lukas > > > Lukas Wunner (6): > PCI: Make pci_wakeup_bus() & pci_bus_set_current_state() public > vga_switcheroo: Update PCI current_state on power change > vga_switcheroo: Deduplicate power state tracking > vga_switcheroo: Use device link for HDA controller > vga_switcheroo: Let HDA autosuspend on mux change > drm/nouveau: Runtime suspend despite HDA being unbound > > Rafael J. Wysocki (1): > PCI: Restore config space on runtime resume despite being unbound > > drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 - > drivers/gpu/drm/nouveau/nouveau_drm.c | 46 ---------- > drivers/gpu/drm/nouveau/nouveau_drv.h | 1 - > drivers/gpu/drm/radeon/radeon_drv.c | 2 - > drivers/gpu/vga/vga_switcheroo.c | 152 ++++++++------------------------ > drivers/pci/pci-driver.c | 17 ++-- > drivers/pci/pci.c | 8 +- > drivers/pci/quirks.c | 39 ++++++++ > include/linux/pci.h | 2 + > include/linux/pci_ids.h | 1 + > include/linux/vga_switcheroo.h | 6 -- > include/sound/hdaudio.h | 3 - > sound/pci/hda/hda_intel.c | 36 +++++--- > sound/pci/hda/hda_intel.h | 3 - > 14 files changed, 117 insertions(+), 201 deletions(-) > > -- > 2.15.1 > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Wu Subject: Re: [PATCH v2 0/7] Modernize vga_switcheroo by using device link for HDA Date: Mon, 5 Mar 2018 21:58:31 +0100 Message-ID: <20180305205831.GA1397@al> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Lukas Wunner Cc: zigarrre-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Imre Deak , "Rafael J. Wysocki" , linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Daniel Drake , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Denis Lisov , Bjorn Helgaas , Martin Lopatar , Alex Deucher , Maik Freudenberg , Raphael Doursenaud List-Id: nouveau.vger.kernel.org SGkgTHVrYXMsCgpTb3JyeSBmb3IgdGhlIGRlbGF5LCBJIGZpbmFsbHkgZm91bmQgc29tZSB0aW1l IHRvIHJldmlld2QgYW5kIHRlc3QgdGhlCnBhdGNoZXMgYW5kIGZvdW5kIHNvbWUgaXNzdWVzIChz b21lIG9mIHRoZW0gbWlnaHQgYWxyZWFkeSBiZSBwcmVzZW50IGluCnY0LjE1IHdpdGhvdXQgeW91 ciBwYXRjaGVzIHRob3VnaCwgSSBkaWQgbm90IHRyeSkuCgpUZXN0IGVudmlyb25tZW50OgotIEJy YW5jaCBzd2l0Y2hlcm9vX2RldmxpbmtfdjIgKGNvbW1pdCB2NC4xNS0yMC1nYjMzZDUwYzVjNmFk KQotIExhcHRvcDogQ2xldm8gUDY1MVJBIChub3V2ZWF1IHVzZXMgUFIzKSwgbHNwY2k6CiAgMDA6 MDEuMCBQQ0kgYnJpZGdlIFswNjA0XTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiBFMy0xMjAwIHY1 L0UzLTE1MDAgdjUvNnRoIEdlbiBDb3JlIFByb2Nlc3NvciBQQ0llIENvbnRyb2xsZXIgKHgxNikg WzgwODY6MTkwMV0gKHJldiAwNykKICAwMTowMC4wIFZHQSBjb21wYXRpYmxlIGNvbnRyb2xsZXIg WzAzMDBdOiBOVklESUEgQ29ycG9yYXRpb24gR00yMDRNIFtHZUZvcmNlIEdUWCA5NjVNXSBbMTBk ZToxM2Q5XSAocmV2IGExKQogIDAxOjAwLjEgQXVkaW8gZGV2aWNlIFswNDAzXTogTlZJRElBIENv cnBvcmF0aW9uIEdNMjA0IEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb250cm9sbGVyIFsxMGRlOjBm YmJdIChyZXYgYTEpCi0gRGlzdHJpYnV0aW9uOiBBcmNoIExpbnV4IHg4Nl82NAotIFRlc3RlZCBm cm9tICgxKSBjb25zb2xlIGFuZCAoMikgWG9yZyAxLjE5LjMtMiAoT3BlbmJveCkKLSBCb290ZWQg d2l0aCBIRE1JIGNhYmxlIGNvbm5lY3RlZCBhbmQgbm91dmVhdS9zbmQtaGRhLWludGVsIHVubG9h ZGVkLgoKVG8gY2hlY2sgdGhlIHJ1bnRpbWUgUE0gc3RhdHVzLCBJIHVzZWQgdGhpcyAicnBtLXN0 YXR1cyIgc2NyaXB0OgoKICAgIGdyZXAgLS1jb2xvciAuIC9zeXMvYnVzL3BjaS9kZXZpY2VzLzAw MDA6MDA6MDEuMC97MDAwMDowMTowMC4wLywwMDAwOjAxOjAwLjEvLH1wb3dlci9jb250cm9sCiAg ICBncmVwIC0tY29sb3IgLiAvc3lzL2J1cy9wY2kvZGV2aWNlcy8wMDAwOjAwOjAxLjAvezAwMDA6 MDE6MDAuMC8sMDAwMDowMTowMC4xLyx9cG93ZXIvcnVudGltZV97ZW5hYmxlZCx1c2FnZSxhY3Rp dmVfa2lkcyxzdGF0dXN9CgoKVG8gdGVzdCBhdWRpbyBvdXRwdXQgKHZpYSBIRE1JOyBEUCBwb3J0 IGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCBhdWRpbyk6CgogICAgc3BlYWtlci10ZXN0IC1EaGRt aTpDQVJEPU5WaWRpYSxERVY9MCAtYzIKCkJlbG93IEkgZmlyc3QgbGlzdCBzb21lIGlzc3Vlcywg dGhlbiBzb21lIGdvb2QgbmV3cy4KCklzc3VlIDEgLSBHUFUgZG9lcyBub3Qgc3VzcGVuZCBvbiB0 ZXh0IGNvbnNvbGUuCldoZW4gcHJlc2VudCBhdCB0aGUgdGV4dCBjb25zb2xlIGFuZCBhbiBleHRl cm5hbCBtb25pdG9yIGlzIGNvbm5lY3RlZAp0aHJvdWdoIEhETUkgb3IgRFAsIHRoZSBSUE0gY291 bnRlciBpcyAxLiBPbmx5IHdoZW4gdGhlIGNhYmxlIGlzIHJlbW92ZWQKKG9yIHdoZW4gImVjaG8g b2ZmID4gL3N5cy9jbGFzcy9kcm0vY2FyZDEtSERNSS1BLTEvc3RhdHVzIiksIHRoZSBSUE0KY291 bnQgZHJvcHMgdG8gMCBhbmQgdGhlIEdQVSBkZXZpY2Ugc3VzcGVuZHMuIFdoZW4gWG9yZyBpcyBz dGFydGVkCihzdGFydHgpLCB0aGUgUlBNIGNvdW50ZXIgYWxzbyBkcm9wcyB0byAwIHRob3VnaC4K Cklzc3VlIDIgLSBSUE0gY291bnRlciBmb3IgYXVkaW8gZnVuY3Rpb24gZHJvcHMgYmVsb3cgMCBv biBzeXN0ZW0gc2xlZXAuCldoZW4gYm90aCBub3V2ZWF1IGFuZCBzbmQtaGRhLWludGVsIGFyZSBs b2FkZWQgYW5kIGEgSERNSSAob3IgRFA/KSBjYWJsZQppcyBjb25uZWN0ZWQsIHRoZSBSUE0gY291 bnRlciBiZWNvbWVzIG9uZSBhZnRlciBzdXNwZW5kL3Jlc3VtZS4gVGhpcwpoYXBwZW5zIGJvdGgg d2l0aCB0ZXh0IGNvbnNvbGUgYW5kIFhvcmcuCgpJc3N1ZSAzIC0gaW52YWxpZCBQQ0kgY29uZmln IHJlYWRzIHRvIGF1ZGlvIGRldmljZSBpZiBkaXNjb25uZWN0ZWQuCldoZW4gbm8gSERNSS9EUCBj YWJsZSBpcyBjb25uZWN0ZWQsIHRoZSBIRE1JIGF1ZGlvIGZ1bmN0aW9uIHdpbGwgYmUKaW5hY2Nl c3NpYmxlIGFmdGVyIHJ1bnRpbWUvc3lzdGVtIHJlc3VtZS4gQXNzdW1lIG5vdXZlYXUgbG9hZGVk IGJlZm9yZQpzL3IsIHRoZW4gbG9hZGluZyBzbmQtaGRhLWludGVsIHdpbGwgZmFpbCB3aXRoOgoK ICAgIDBdOiBwYW1fdW5peChzdWRvOnNlc3Npb24pOiBzZXNzaW9uIGNsb3NlZCBmb3IgdXNlciBy b290CiAgICBoZGF1ZGlvIGhkYXVkaW9DMUQwOiBubyBBRkcgb3IgTUZHIG5vZGUgZm91bmQKICAg IGhkYXVkaW8gaGRhdWRpb0MxRDE6IG5vIEFGRyBvciBNRkcgbm9kZSBmb3VuZAogICAgaGRhdWRp byBoZGF1ZGlvQzFEMjogbm8gQUZHIG9yIE1GRyBub2RlIGZvdW5kCiAgICBoZGF1ZGlvIGhkYXVk aW9DMUQzOiBubyBBRkcgb3IgTUZHIG5vZGUgZm91bmQKICAgIGhkYXVkaW8gaGRhdWRpb0MxRDQ6 IG5vIEFGRyBvciBNRkcgbm9kZSBmb3VuZAogICAgaGRhdWRpbyBoZGF1ZGlvQzFENTogbm8gQUZH IG9yIE1GRyBub2RlIGZvdW5kCiAgICBoZGF1ZGlvIGhkYXVkaW9DMUQ2OiBubyBBRkcgb3IgTUZH IG5vZGUgZm91bmQKICAgIGhkYXVkaW8gaGRhdWRpb0MxRDc6IG5vIEFGRyBvciBNRkcgbm9kZSBm b3VuZAogICAgc25kX2hkYV9pbnRlbCAwMDAwOjAxOjAwLjE6IG5vIGNvZGVjcyBpbml0aWFsaXpl ZAoKQWZ0ZXIgcm1tb2Qgc25kLWhkYS1pbnRlbCBhbmQgc3lzdGVtIHN1c3BlbmQvcmVzdW1lOgoK ICAgIHBjaSAwMDAwOjAxOjAwLjE6IHJlc3RvcmluZyBjb25maWcgc3BhY2UgYXQgb2Zmc2V0IDB4 M2MgKHdhcyAweGZmZmZmZmZmLCB3cml0aW5nIDB4MjAwKQogICAgcGNpIDAwMDA6MDE6MDAuMTog cmVzdG9yaW5nIGNvbmZpZyBzcGFjZSBhdCBvZmZzZXQgMHgzOCAod2FzIDB4ZmZmZmZmZmYsIHdy aXRpbmcgMHgwKQogICAgcGNpIDAwMDA6MDE6MDAuMTogcmVzdG9yaW5nIGNvbmZpZyBzcGFjZSBh dCBvZmZzZXQgMHgzNCAod2FzIDB4ZmZmZmZmZmYsIHdyaXRpbmcgMHg2MCkKClRoaXMgcGVyc2lz dHMgdW50aWwgcmVtb3ZpbmcgYm90aCBQQ0kgZGV2aWNlcyBhbmQgcmVzY2FubmluZyB0aGUgcm9v dApwb3J0LiAoV2hlbiBubyBIRE1JL0RQIGNhYmxlIGlzIGNvbm5lY3RlZCwgdGhlIGF1ZGlvIGZ1 bmN0aW9uIHdpbGwgbm90CmFwcGVhcjsgcmVtb3ZlK3Jlc2NhbiBpcyByZXF1aXJlZCB0byByZWNv dmVyLikKCklzc3VlIDQgLSBydW50aW1lX2FjdGl2ZV9raWRzIGxlYWsgd2l0aCBhdWRpbyBmdW5j dGlvbi4KQWZ0ZXIgdGhlIGFib3ZlIGlzc3VlLCB0aGUgYXVkaW8gZGV2aWNlIG5ldmVyIGVudGVy ZWQgdGhlIHN1c3BlbmRlZApzdGF0ZSBldmVuIHRob3VnaCB0aGUgcnVudGltZV91c2FnZSBjb3Vu dGVyIHJlYWNoZWQgMC4gSXQgdHVybmVkIG91dAp0aGF0IHJ1bnRpbWVfYWN0aXZlX2tpZHMgd2Fz IDQuIEV2ZXJ5IHRpbWUgc25kLWhkYS1pbnRlbCBpcyBsb2FkZWQgKGFuZApmYWlscyB0byBpbml0 aWFsaXplIGR1ZSB0byB0aGUgYWJvdmUgaXNzdWUpLCB0aGlzIGNvdW50ZXIgaXMgaW5jcmVhc2Vk LgoKSXNzdWUgNSAtIGF1ZGlvIGJyZWFrcyBhZnRlciBzeXN0ZW0gc2xlZXAgb3Igc3RvcHBpbmcg WG9yZy4KV2hlbiBYb3JnIGlzIHN0b3BwZWQgb3IgdGhlIHN5c3RlbSBzbGVlcC9yZXN1bWVzIHdo aWxlIHNwZWFrZXItdGVzdCBpcwphY3RpdmUgKGUuZy4gaW4gR05VIHNjcmVlbiksIGF1ZGlvIHN0 b3BzIHBsYXlpbmcgYW5kIHNwZWFrZXItdGVzdCBleGl0cy4KCklzc3VlIDYgLSB3cm9uZyBwaW4g c3RhdHVzIHJlcG9ydGVkIC8gbm8gYXVkaW8KKFBvc3NpYmx5ICJ3b3JraW5nIGFzIGV4cGVjdGVk IiBzaW5jZSBhdWRpbyBpcyB0aWVkIHRvIEdQVSBmdW5jdGlvbi4pClNjZW5hcmlvOiBIRE1JIGNh YmxlIGlzIGNvbm5lY3RlZCBidXQgR1BVIGlzIHVudXNlZAooImVjaG8gb2ZmID4gL3N5cy9jbGFz cy9kcm0vY2FyZDEtSERNSS0xLTEvc3RhdHVzIiBmcm9tIGNvbnNvbGUgb3IKd2l0aCAieHJhbmRy IC0tb3V0cHV0IEhETUktQS0xIC0tb2ZmIikuIGhkYWphY2tzZW5zZXRlc3QgcmVwb3J0cyBubwpI RE1JIHBpbiBwcmVzZW5jZSBldmVuIGlmIGNvbm5lY3RlZCwgZG1lc2cgcmVwb3J0czoKCiAgICBu b3V2ZWF1IDAwMDA6MDE6MDAuMDogRFJNOiBEREMgcmVzcG9uZGVkLCBidXQgbm8gRURJRCBmb3Ig SERNSS1BLTEKClVzaW5nICJzcGVha2VyLXRlc3QiLCB0aGUgcHJvZ3JhbSBkb2VzIG5vdCBmYWls IGJ1dCBubyBzb3VuZCBjYW4gYmUKaGVhcmQgZWl0aGVyLgoKSXNzdWUgNyAtIG5vdXZlYXU6IHdh cm5pbmcgYWZ0ZXIgdW5sb2FkaW5nIGFmdGVyIHN0b3BwaW5nIFhvcmcKKElzc3VlIGluIG5vdXZl YXUsIGxpa2VseSBub3QgcmVsYXRlZCB0byB0aGlzIHBhdGNoIHNldC4pCkFmdGVyICJ4cmFuZHIg LS1vdXRwdXQgSERNSS0xLTEgLS1tb2RlIDI1NjB4MTQ0MCIgaW4gWG9yZywgc3RvcHBpbmcgWG9y ZwooYW5kIHBvc3NpYmx5ICJlY2hvIG9mZiA+IC9zeXMvY2xhc3MvZHJtL2NhcmQxLUhETUktQS0x L3N0YXR1cyIpLApyZW1vdmluZyBub3V2ZWF1IHRyaWdnZXJlZDoKCiAgICBXQVJOSU5HOiBDUFU6 IDcgUElEOiA1NDc1IGF0IGRyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZV9jb25maWcuYzo0MzkgZHJt X21vZGVfY29uZmlnX2NsZWFudXArMHgxZmEvMHgyNjAKICAgIENQVTogNyBQSUQ6IDU0NzUgQ29t bTogcm1tb2QgTm90IHRhaW50ZWQgNC4xNS4wdGVzdGluZy0wMDAyMC1nYjMzZDUwYzVjNmFkICM1 NQogICAgUklQOiAwMDEwOmRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKzB4MWZhLzB4MjYwCiAgICBb Li5dCiAgICBDYWxsIFRyYWNlOgogICAgIG5vdXZlYXVfZGlzcGxheV9kZXN0cm95KzB4NDEvMHg4 MCBbbm91dmVhdV0KICAgICBub3V2ZWF1X2RybV91bmxvYWQrMHg2Yi8weGQwIFtub3V2ZWF1XQog ICAgIGRybV9kZXZfdW5yZWdpc3RlcisweDNjLzB4ZTAKICAgICBkcm1fcHV0X2RldisweDJlLzB4 NjAKICAgICBub3V2ZWF1X2RybV9kZXZpY2VfcmVtb3ZlKzB4MzcvMHg1MCBbbm91dmVhdV0KICAg ICBwY2lfZGV2aWNlX3JlbW92ZSsweDM2LzB4YjAKICAgICBkZXZpY2VfcmVsZWFzZV9kcml2ZXJf aW50ZXJuYWwrMHgxNjAvMHgyMzAKICAgICBkcml2ZXJfZGV0YWNoKzB4M2EvMHg3MAogICAgIGJ1 c19yZW1vdmVfZHJpdmVyKzB4NTgvMHhkMAogICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcisweDNi LzB4OTAKICAgICBub3V2ZWF1X2RybV9leGl0KzB4MTUvMHg0MzIgW25vdXZlYXVdCiAgICAgU3lT X2RlbGV0ZV9tb2R1bGUrMHgxNmMvMHgyMzAKCklzc3VlIDggLSBhY3BpOiBzbGVlcGluZyBmdW5j dGlvbiBpbiBhdG9taWMgY29udGV4dC4KKElzc3VlIGlzIGxpa2VseSBub3QgcmVsYXRlZCB0byB0 aGlzIHBhdGNoIHNldC4pCkF0IHNvbWUgcG9pbnQgSSBhbHNvIGdvdCBhIEJVRywgbm91dmVhdSB3 YXMgYWxyZWFkeSB1bmxvYWRlZCBhbmQgSSByYW46CiJlY2hvIDEgfCB0ZWUgL3N5cy9idXMvcGNp L2RldmljZXMvMDAwMDowMTowMC57MCwxfS9yZW1vdmUiCgogICAgQlVHOiBzbGVlcGluZyBmdW5j dGlvbiBjYWxsZWQgZnJvbSBpbnZhbGlkIGNvbnRleHQgYXQgL2hvbWUvcGV0ZXIvbGludXgvbW0v c2xhYi5oOjQxOQogICAgaW5fYXRvbWljKCk6IDEsIGlycXNfZGlzYWJsZWQoKTogMCwgcGlkOiA0 ODQ0LCBuYW1lOiBrd29ya2VyLzM6NAogICAgSU5GTzogbG9ja2RlcCBpcyB0dXJuZWQgb2ZmLgog ICAgQ1BVOiAzIFBJRDogNDg0NCBDb21tOiBrd29ya2VyLzM6NCBUYWludGVkOiBHICAgICAgICBX ICAgICAgICA0LjE1LjB0ZXN0aW5nLTAwMDIwLWdiMzNkNTBjNWM2YWQgIzU1CiAgICBIYXJkd2Fy ZSBuYW1lOiBOb3RlYm9vayAgICAgICAgICAgICAgICAgICAgICAgICBQNjVfUDY3UkdSRVJBL1A2 NV9QNjdSR1JFUkEsIEJJT1MgMS4wNS4xNiAwNS8xNi8yMDE2CiAgICBXb3JrcXVldWU6IGV2ZW50 c19wb3dlcl9lZmZpY2llbnQgc3JjdV9pbnZva2VfY2FsbGJhY2tzCiAgICBDYWxsIFRyYWNlOgog ICAgIGR1bXBfc3RhY2srMHg1Zi8weDg2CiAgICAgX19fbWlnaHRfc2xlZXArMHgyMGMvMHgyNDAK ICAgICBrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKzB4NGQvMHgyMzAKICAgICBhY3BpX3V0X2V2YWx1 YXRlX29iamVjdCsweDY4LzB4MjNjCiAgICAgPyBzcmN1X2ludm9rZV9jYWxsYmFja3MrMHhhMi8w eDE1MAogICAgIGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YSsweDQyLzB4YTIKICAgICBhY3Bp X2dldF9pcnFfcm91dGluZ190YWJsZSsweDcwLzB4OWYKICAgICA/IF9fc2xhYl9mcmVlKzB4MTFj LzB4MzgwCiAgICAgYWNwaV9wY2lfaXJxX2ZpbmRfcHJ0X2VudHJ5KzB4ODMvMHgzMzAKICAgICA/ IHNyY3VfaW52b2tlX2NhbGxiYWNrcysweGEyLzB4MTUwCiAgICAgYWNwaV9wY2lfaXJxX2xvb2t1 cCsweDI3LzB4MmUwCiAgICAgYWNwaV9wY2lfaXJxX2Rpc2FibGUrMHg0NS8weGIwCiAgICAgcGNp X3JlbGVhc2VfZGV2KzB4MjkvMHg2MAogICAgIGRldmljZV9yZWxlYXNlKzB4MmQvMHg4MAogICAg IGtvYmplY3RfcHV0KzB4YjcvMHgxOTAKICAgICBfX2RldmljZV9saW5rX2ZyZWVfc3JjdSsweDMy LzB4NDAKICAgICBzcmN1X2ludm9rZV9jYWxsYmFja3MrMHhiYS8weDE1MAogICAgIHByb2Nlc3Nf b25lX3dvcmsrMHgyNzMvMHg2NzAKICAgICB3b3JrZXJfdGhyZWFkKzB4NGEvMHg0MDAKICAgICBr dGhyZWFkKzB4MTAwLzB4MTQwCiAgICAgPyBwcm9jZXNzX29uZV93b3JrKzB4NjcwLzB4NjcwCiAg ICAgPyBrdGhyZWFkX2NyZWF0ZV93b3JrZXJfb25fY3B1KzB4NTAvMHg1MAogICAgID8gZG9fc3lz Y2FsbF82NCsweDU2LzB4MWEwCiAgICAgPyBTeVNfZXhpdF9ncm91cCsweDEwLzB4MTAKCklzc3Vl IDkgLSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24uCkF0IHNvbWUgcG9pbnQgKHBvc3NpYmx5 IGFmdGVyIGlzc3VlIDcsIGJ1dCBJIGFtIG5vdCBmdWxseSBzdXJlKSwgSSBzYXcKYW4gYXJ0aWZh Y3QgaW4gdGhlIHRleHQgY29uc29sZSB3aGljaCB3b3VsZCBwZXJzaXN0IGV2ZW4gd2hlbiBzd2l0 Y2hpbmcKYmV0d2VlbiBjb25zb2xlcy4gSXQgd2FzIGdvbmUgYWZ0ZXIgc3lzdGVtIHNsZWVwL3Jl c3VtZS4gSWYgSSByZW1lbWJlcgpjb3JyZWN0bHksIGl0IGxvb2tlZCBsaWtlIHNvbWV0aGluZyBm cm9tIGEgWG9yZyBzZXNzaW9uIHdoaWNoIEkga2lsbGVkCmJlZm9yZS4KClRoYXQgd2FzIHRoZSBi YWQgbmV3cywgdGhlIGdvb2QgbmV3czoKLSBMb2FkaW5nIG5vdXZlYXUgYW5kIHNuZC1oZGEtaW50 ZWwgKGluIGFueSBvcmRlcikgd2hpbGUgUlBNIGlzIGVuYWJsZWQKICBhbmQgdGhlIHBvcnQgd2Fz IGluIEQzY29sZCB3b3Jrcy4KLSBSUE0gaW50ZXJhY3Rpb24gYmV0d2VlbiBhdWRpbyBhbmQgR1BV IHNlZW1zIGdvb2QsIHdoZW4gYXVkaW8gcmVzdW1lcywKICB0aGUgR1BVIFJQTSBjb3VudGVyIGlu Y3JlbWVudHMsIHdoZW4gYXVkaW8gc3VzcGVuZHMgaXQgZGVjcmVtZW50cy4KLSBBcyB0aGUgR1BV IGVudGVycyBEM2NvbGQsIEkgY2FuIG9ic2VydmUgc2lnbmlmaWNhbnQgcG93ZXIgc2F2aW5ncwog IHRocm91Z2ggL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvQkFUMC8gKG5vIHJlZ3Jlc3Npb25zIGhl cmUpLgotIEluIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIEkgaGF2ZSBubyBhdWRpbyBmdW5jdGlv biAoc2VlIGFsc28gbm91dmVhdQogIGJ1ZyBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3No b3dfYnVnLmNnaT9pZD03NTk4NSkgc28gbW9zdCBvZiB0aGUKICBhYm92ZSBpc3N1ZXMgc2hvdWxk IG5vdCBvY2N1ci4KCkhvcGUgaXQgaGVscHMsIGFuZCBpZiBkZXNpcmVkIHlvdSBjYW4gYWRkOgpU ZXN0ZWQtYnk6IFBldGVyIFd1IDxwZXRlckBsZWtlbnN0ZXluLm5sPgoKRm9yIHRoZSBmb2xsb3dp bmcgcGF0Y2hlcywgeW91IGNhbiBhbHNvIGFkZCBteSBSZXZpZXdlZC1ieToKCiAgICB2Z2Ffc3dp dGNoZXJvbzogVXBkYXRlIFBDSSBjdXJyZW50X3N0YXRlIG9uIHBvd2VyIGNoYW5nZQogICAgdmdh X3N3aXRjaGVyb286IERlZHVwbGljYXRlIHBvd2VyIHN0YXRlIHRyYWNraW5nCiAgICB2Z2Ffc3dp dGNoZXJvbzogVXNlIGRldmljZSBsaW5rIGZvciBIREEgY29udHJvbGxlcgogICAgdmdhX3N3aXRj aGVyb286IExldCBIREEgYXV0b3N1c3BlbmQgb24gbXV4IGNoYW5nZQogICAgZHJtL25vdXZlYXU6 IFJ1bnRpbWUgc3VzcGVuZCBkZXNwaXRlIEhEQSBiZWluZyB1bmJvdW5kCgpUaGUgdHdvIG90aGVy IFBDSSBwYXRjaGVzIGxvb2sgZmluZSBhcyB3ZWxsLgoKS2luZCByZWdhcmRzLApQZXRlcgoKT24g U2F0LCBNYXIgMDMsIDIwMTggYXQgMTA6NTM6MjRBTSArMDEwMCwgTHVrYXMgV3VubmVyIHdyb3Rl Ogo+IE1vZGVybml6ZSB2Z2Ffc3dpdGNoZXJvbyBieSB1c2luZyBhIGRldmljZSBsaW5rIHRvIGVu Zm9yY2UgYSBydW50aW1lIFBNCj4gZGVwZW5kZW5jeSBmcm9tIGFuIEhEQSBjb250cm9sbGVyIHRv IHRoZSBHUFUgaXQncyBpbnRlZ3JhdGVkIGludG8sIHYyLgo+IAo+IENoYW5nZXMgc2luY2UgdjE6 Cj4gCj4gLSBSZXBsYWNlIHBhdGNoIFsxLzddIHRvIHVzZSBwY2lfc2F2ZV9zdGF0ZSgpIC8gcGNp X3Jlc3RvcmVfc3RhdGUoKQo+ICAgZm9yIGNvbnNpc3RlbmN5IGJldHdlZW4gcnVudGltZSBQTSBj b2RlIHBhdGggb2YgYm91bmQgYW5kIHVuYm91bmQKPiAgIGRldmljZXMuIChSYWZhZWwsIEJqb3Ju KQo+IAo+IC0gUGF0Y2ggWzUvN106IERyb3AgYW4gdW5uZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24u IChCam9ybikKPiAgIFJlcGhyYXNlIGVycm9yIG1lc3NhZ2Ugb24gZmFpbGVkIGxpbmsgYWRkaXRp b24gZm9yIGNsYXJpdHkuCj4gCj4gTGluayB0byB2MToKPiBodHRwczovL3d3dy5zcGluaWNzLm5l dC9saXN0cy9kcmktZGV2ZWwvbXNnMTY1ODg5Lmh0bWwKPiAKPiBUZXN0aW5nIG9uIG1vcmUgbWFj aGluZXMgd291bGQgYmUgZ3JlYXRseSBhcHByZWNpYXRlZCwgcGFydGljdWxhcmx5Cj4gTnZpZGlh IE9wdGltdXMgb3IgQU1EIFBvd2VyWHByZXNzLgo+IAo+IFRoZSBzZXJpZXMgaXMgYmFzZWQgb24g NC4xNi1yYzMuICBUbyB0ZXN0IGl0IG9uIDQuMTUsIHlvdSBuZWVkIHRvCj4gY2hlcnJ5LXBpY2sg NzUwNmRjNzk4OTkzIGFuZCAyZmE2ZDZjZGFmMjguICBGb3IgeW91ciBjb252ZW5pZW5jZQo+IEkn dmUgcHVzaGVkIGEgNC4xNS1iYXNlZCBicmFuY2ggdG86Cj4gaHR0cHM6Ly9naXRodWIuY29tL2wx ay9saW51eC9jb21taXRzL3N3aXRjaGVyb29fZGV2bGlua192Mgo+IAo+IE1pbmltYWwgdGVzdCBw cm9jZWR1cmU6Cj4gCj4gLSBOb3RlIHdlbGw6IFJlY2VudCBPcHRpbXVzIHJlcXVpcmUgdGhhdCBh IE1pbmktRFAgb3IgSERNSSBjYWJsZSBpcwo+ICAgcGx1Z2dlZCBpbiBvbiBib290IGZvciB0aGUg SERBIGRldmljZSB0byBiZSBwcmVzZW50Lgo+IAo+IC0gQ2hlY2sgdGhhdCBIREEsIEdQVSBhbmQg cm9vdCBwb3J0IGF1dG9zdXNwZW5kIHdoZW4gbm90IGluIHVzZToKPiAgIGNhdCAvc3lzL2J1cy9w Y2kvZGV2aWNlcy8wMDAwOjAxOjAwLjEvcG93ZXIvcnVudGltZV9zdGF0dXMgICMgSERBCj4gICBj YXQgL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMTowMC4wL3Bvd2VyL3J1bnRpbWVfc3RhdHVz ICAjIEdQVQo+ICAgY2F0IC9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDA6MDEuMC9wb3dlci9y dW50aW1lX3N0YXR1cyAgIyBSb290IFBvcnQKPiAKPiAtIENoZWNrIHRoYXQgYWxsIHRocmVlIGF1 dG9yZXN1bWUgd2hlbiBhY2Nlc3NpbmcgdGhlIEhEQToKPiAgIGhkYWphY2tzZW5zZXRlc3QgLWMg MQo+IAo+IC0gVW5iaW5kIHRoZSBIREEgY29udHJvbGxlcjoKPiAgIGVjaG8gMDAwMDowMTowMC4x ID4gL3N5cy9idXMvcGNpL2RyaXZlcnMvc25kX2hkYV9pbnRlbC91bmJpbmQKPiAgIFdhaXQgZm9y IEdQVSB0byBwb3dlciBvZmYsIHRoZW4gcmViaW5kIHRoZSBIREEgY29udHJvbGxlcjoKPiAgIGVj aG8gMDAwMDowMTowMC4xID4gL3N5cy9idXMvcGNpL2RyaXZlcnMvc25kX2hkYV9pbnRlbC9iaW5k Cj4gICBDaGVjayBkbWVzZyBmb3IgZXJyb3JzLCB0cnkgYWNjZXNzaW5nIEhEQSB3aXRoIGhkYWph Y2tzZW5zZXRlc3QuCj4gCj4gLSBJZiB5b3VyIGxhcHRvcCB1c2VzIHRoZSByb290IHBvcnQncyBf UFIzIHRvIGN1dCBwb3dlciB0byB0aGUgR1BVOgo+ICAgVW5iaW5kIHRoZSBHUFU6Cj4gICBlY2hv IDAwMDA6MDE6MDAuMCA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3tub3V2ZWF1LGFtZGdwdSxyYWRl b259L3VuYmluZAo+ICAgQWxsb3cgcnVudGltZSBQTSBvbiB0aGUgR1BVOgo+ICAgZWNobyBhdXRv ID4gL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMTowMC4wL3Bvd2VyL2NvbnRyb2wKPiAgIFdh aXQgZm9yIEdQVSB0byBwb3dlciBvZmYsIHRoZW4gcmViaW5kIGl0Ogo+ICAgZWNobyAwMDAwOjAx OjAwLjAgPiAvc3lzL2J1cy9wY2kvZHJpdmVycy97bm91dmVhdSxhbWRncHUscmFkZW9ufS9iaW5k Cj4gICBDaGVjayBkbWVzZyBmb3IgZXJyb3JzLiAgSWYgeW91IHNlZSBhbnkgdGhlbiB3ZSBtYXkg bmVlZCB0byBwZXJmb3JtCj4gICBmdXJ0aGVyIGFjdGlvbnMgaW4gcGNpX3BtX3J1bnRpbWVfcmVz dW1lKCksIHNlZSBwYXRjaCBbMS83XS4KPiAKPiBUaGFua3MsCj4gCj4gTHVrYXMKPiAKPiAKPiBM dWthcyBXdW5uZXIgKDYpOgo+ICAgUENJOiBNYWtlIHBjaV93YWtldXBfYnVzKCkgJiBwY2lfYnVz X3NldF9jdXJyZW50X3N0YXRlKCkgcHVibGljCj4gICB2Z2Ffc3dpdGNoZXJvbzogVXBkYXRlIFBD SSBjdXJyZW50X3N0YXRlIG9uIHBvd2VyIGNoYW5nZQo+ICAgdmdhX3N3aXRjaGVyb286IERlZHVw bGljYXRlIHBvd2VyIHN0YXRlIHRyYWNraW5nCj4gICB2Z2Ffc3dpdGNoZXJvbzogVXNlIGRldmlj ZSBsaW5rIGZvciBIREEgY29udHJvbGxlcgo+ICAgdmdhX3N3aXRjaGVyb286IExldCBIREEgYXV0 b3N1c3BlbmQgb24gbXV4IGNoYW5nZQo+ICAgZHJtL25vdXZlYXU6IFJ1bnRpbWUgc3VzcGVuZCBk ZXNwaXRlIEhEQSBiZWluZyB1bmJvdW5kCj4gCj4gUmFmYWVsIEouIFd5c29ja2kgKDEpOgo+ICAg UENJOiBSZXN0b3JlIGNvbmZpZyBzcGFjZSBvbiBydW50aW1lIHJlc3VtZSBkZXNwaXRlIGJlaW5n IHVuYm91bmQKPiAKPiAgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2Rydi5jIHwg ICAyIC0KPiAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcm0uYyAgIHwgIDQ2IC0t LS0tLS0tLS0KPiAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaCAgIHwgICAx IC0KPiAgZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMgICAgIHwgICAyIC0KPiAg ZHJpdmVycy9ncHUvdmdhL3ZnYV9zd2l0Y2hlcm9vLmMgICAgICAgIHwgMTUyICsrKysrKysrLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gIGRyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyAgICAgICAg ICAgICAgICB8ICAxNyArKy0tCj4gIGRyaXZlcnMvcGNpL3BjaS5jICAgICAgICAgICAgICAgICAg ICAgICB8ICAgOCArLQo+ICBkcml2ZXJzL3BjaS9xdWlya3MuYyAgICAgICAgICAgICAgICAgICAg fCAgMzkgKysrKysrKysKPiAgaW5jbHVkZS9saW51eC9wY2kuaCAgICAgICAgICAgICAgICAgICAg IHwgICAyICsKPiAgaW5jbHVkZS9saW51eC9wY2lfaWRzLmggICAgICAgICAgICAgICAgIHwgICAx ICsKPiAgaW5jbHVkZS9saW51eC92Z2Ffc3dpdGNoZXJvby5oICAgICAgICAgIHwgICA2IC0tCj4g IGluY2x1ZGUvc291bmQvaGRhdWRpby5oICAgICAgICAgICAgICAgICB8ICAgMyAtCj4gIHNvdW5k L3BjaS9oZGEvaGRhX2ludGVsLmMgICAgICAgICAgICAgICB8ICAzNiArKysrKy0tLQo+ICBzb3Vu ZC9wY2kvaGRhL2hkYV9pbnRlbC5oICAgICAgICAgICAgICAgfCAgIDMgLQo+ICAxNCBmaWxlcyBj aGFuZ2VkLCAxMTcgaW5zZXJ0aW9ucygrKSwgMjAxIGRlbGV0aW9ucygtKQo+IAo+IC0tIAo+IDIu MTUuMQo+IApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpO b3V2ZWF1IG1haWxpbmcgbGlzdApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZlYXUK