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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44900C3F6B0 for ; Tue, 2 Aug 2022 01:51:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235399AbiHBBve (ORCPT ); Mon, 1 Aug 2022 21:51:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232281AbiHBBve (ORCPT ); Mon, 1 Aug 2022 21:51:34 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BCECC13E9B; Mon, 1 Aug 2022 18:51:30 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 4244961043; Tue, 2 Aug 2022 01:51:30 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C087AC433D6; Tue, 2 Aug 2022 01:51:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1659405089; bh=3xVDpblfOW7CRBHtYe2gNVEKPz4HST8R7lJSNE6BaVE=; h=From:To:Cc:Subject:Date:From; b=GVKBjD1EJN4dOLawblA1z8mMlS1FDXGh2nbXJ/tOvHoLFcgGwcyIEfnaOnDsfo1ce gNtXgUcCnaFdG2kL6xTigY1xJHR/EvTD2f+fv45wtjK76opvDViK6FgkmkYn++RSSj vU/OlgZV9zEI8z+Vgppc3bWsCWF+QsehqAiVd17dMbAsx7QJAzHBGYcgYgKi/Ax0Mc gCtkFh1ScY2phKKmSeDZQSJh1FWwybHhMK1j2IrTsSmKGbvhNs0odtcK+tOJgtXroU OxnZfC2VWvt2/OTCg6FuqeVyx4SWCVhisFEcI1LURYsHYyxqhxlKqsWzizpNzr9qN6 mcmhY+Y9LnIdQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-um@lists.infradead.org, live-patching@vger.kernel.org Subject: [PATCH v8 00/31] Rust support Date: Tue, 2 Aug 2022 03:49:47 +0200 Message-Id: <20220802015052.10452-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org Rust support This is the patch series (v8) to add support for Rust as a second language to the Linux kernel. If you are interested in following this effort, please join us in the mailing list at: rust-for-linux@vger.kernel.org and take a look at the project itself at: https://github.com/Rust-for-Linux As usual, special thanks go to ISRG (Internet Security Research Group) and Google for their financial support on this endeavor. Cheers, Miguel -- # Rust support This cover letter explains the major changes and updates done since the previous ones. For those, please see: RFC: https://lore.kernel.org/lkml/20210414184604.23473-1-ojeda@kernel.org/ v1: https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/ v2: https://lore.kernel.org/lkml/20211206140313.5653-1-ojeda@kernel.org/ v3: https://lore.kernel.org/lkml/20220117053349.6804-1-ojeda@kernel.org/ v4: https://lore.kernel.org/lkml/20220212130410.6901-1-ojeda@kernel.org/ v5: https://lore.kernel.org/lkml/20220317181032.15436-1-ojeda@kernel.org/ v6: https://lore.kernel.org/lkml/20220507052451.12890-1-ojeda@kernel.org/ v7: https://lore.kernel.org/lkml/20220523020209.11810-1-ojeda@kernel.org/ ## Infrastructure updates There have been several improvements to the overall Rust support: - Upgraded toolchain and `alloc` to Rust 1.62.0 from 1.60.0. Rust 1.61.0 stabilized `feature(const_fn_trait_bound)` that we are using. - Moved bindings into their own crate, `bindings`. This greatly improves build time when only the `kernel` crate changes (which previously contained the bindings). - Disabled unused `bindgen`'s layout test generation, which makes rust-analyzer significantly faster to run. - `bindgen` can now be detected via the `__BINDGEN__` macro, which we currently use to workaround an issue with the `btf_type_tag` attribute. - Reimplemented `concat_idents!` (an unstable standard library macro) as a proc macro, which means we no longer rely on `feature(concat_idents)`. Furthermore, the proc macro allows to refer to local variables. - Reimplemented `static_assert!` in a more idiomatic way, now that `core::assert!()` is supported in const contexts. - Made `build_error!`' work under `RUST_BUILD_ASSERT_{WARN,ALLOW}` for modules. - Removed `__mulodi4` panicking stub. - Added `kernel/configs/rust.config`. - Added a (temporary) self-test module for "pure" Rust tests. - Changed `.i` macro expanded files to the `.rsi` extension and clarified that they are not intended to be compilable. - Dropped support for compiling the Rust side with a different optimization level than the C side. - The Linux/Tux SVG logo (recently upstreamed) is used for the generated Rust documentation, instead of the GIF one. The `COPYING-logo` file is bundled too. - Other cleanups, fixes and improvements. ## Abstractions and driver updates Some of the improvements to the abstractions and example drivers are: - Filesystem support (`fs` module), including: + `INode` type (which wraps `struct inode`). + `DEntry` type (which wraps `struct dentry`). + `Filename` type (which wraps `struct filename`). + `Registration` type. + `Type` and `Context` traits. + `SuperBlock` type (which wraps `struct super_block` and takes advantage of typestates for its initialization). + File system parameters support (with a `Value` enum; `Spec*` and `Constant*` types, `define_fs_params!` macro...). + File system flags. + `module_fs!` macro to simplify registering kernel modules that only implement a single file system. + A file system sample. - Workqueues support (`workqueue` module), including a `Work` type (which wraps `struct work_struct`), a `Queue` type (which wraps `struct workqueue_struct`), access to different system queues as well as macros to simplify usage, e.g.: spawn_work_item!(workqueue::system(), || pr_info!("Hi!\n"))?; - More asynchronous support (`kasync` module), including: + Executor support (including `Task` and `Executor` traits, a `AutoStopHandle` type that automatically stops the executor on drop, a `spawn_task!` macro that automatically defines a new lockdep lock class...). + A workqueue-based executor, which allows to run tasks on dedicated or shared thread pools that are managed by existing C kernel infrastructure, e.g.: let mut handle = Executor::try_new(workqueue::system())?; spawn_task!(handle.executor(), async { pr_info!("First workqueue task\n"); })?; spawn_task!(handle.executor(), async { pr_info!("Second workqueue task\n"); })?; handle.detach(); + A `yield_now()` function that yields execution of the current task so that other ones may execute (but keeps it runnable so that it will run again as soon as the executor is available again), e.g.: async fn example() { pr_info!("Before yield\n"); yield_now().await; pr_info!("After yield\n"); } + `AsyncRevocable` type (in the `revocable` module), which allows access to objects to be revoked without having to wait for existing users to complete. This is useful to drop futures in tasks when executors are being torn down. + An asynchronous TCP echo server sample. - Introduced support for handling interrupts: `[Threaded]Handler` traits, `[Threaded]Registration` types, a `Return` enum (as the return value from handlers) and flags: struct Example; impl irq::Handler for Example { type Data = Box; fn handle_irq(_data: &u32) -> irq::Return { irq::Return::None } } fn request_irq(irq: u32, data: Box) -> Result> { irq::Registration::try_new( irq, data, irq::flags::SHARED, fmt!("example_{irq}") ) } - Introduced the `#[vtable]` proc macro attribute to simplify how function pointer tables like `struct file_operations` are used by Rust kernel modules. Previously, users had to call a `declare_*_operations!` macro which required passing the defined operations: impl file::Operations for SomeFile { ... declare_file_operations!(read, write, ioctl, ...); ... } Instead, now it is only required that they annotate the `impl` block with the attribute: #[vtable] impl file::Operations for SomeFile { ... } The proc macro will generate a boolean `HAS_*` associated constant for each method in the trait, indicating if the implementer has overridden a method. - Added `unsafe_list::List`, an intrusive circular doubly-linked list, meant to be used as the basis for other linked lists. It is also used in the workqueue-based executor to keep track of all tasks since it is cheaper than other options. - Initial RCU support: a `Guard` type that represents evidence that the RCU read side lock is held on the current thread/CPU. In addition, `Revocable` now uses this new abstraction so that users can provide evidence of the RCU read side lock being held when accessing the protected object, e.g.: fn add_pair(value: &Revocable<(u32, u32)>) -> Option { let guard = rcu::read_lock(); let pair = value.try_access_with_guard(&guard)?; Some(pair.0 + pair.1) } - Added `StaticRef` which allows the creation of "reference-counted" globals; i.e. allows to define static variables that can be used when `Ref` or `RefBorrow<'_, T>` are expected. This, in turn, allows to have functions that return shared resources (e.g. a global workqueue) without allocations (the shared object is statically allocated). - Added `Task::spawn()` function to create and automatically run kernel threads easily, e.g.: for i in 0..10 { Task::spawn(fmt!("test{i}"), threadfn).unwrap(); } - Added `Task::wake_up()` method. - Converted `Task` to use `ARef` to unify the usage of all ref-counted C structures. - Initial support for delays/sleeps (`delay` module) with a basic `coarse_sleep()` function that wraps the C side `msleep()` and takes advantage of the `Duration` standard library type: coarse_sleep(Duration::from_millis(20)); - Added file flags (to further reduce `bindings::*` usage), e.g.: let blocking = (file.flags() & file::flags::O_NONBLOCK) == 0; - Added `gpio_chip_register!` and `gpio_irq_chip_register!` macros which automatically define the required lock classes. - Removal of `bindings::lock_class_key` from drivers. This gets us closer to eventually make bindings private to the `kernel` crate. - Moved usage of `ManuallyDrop` to `MaybeUninit` in `Revocable`, which was unsound. - Other cleanups, fixes and improvements. ## Patch series updates The patch series has been reorganized a bit since last time: - The `include/linux/` changes for the C helpers have been moved into their own small patches, which can be taken independently as prerequisite patches if needed. - Now that the bindings are in their own `bindings` crate, they also get their own patch. - There is a new patch that adds the `kernel/configs/rust.config`. - One of the `kallsyms` patches has been split into three smaller ones. - Cleaned up some "exceeds 100 columns" `checkpatch.pl` warnings. With this final cleanup, the remaining warnings (of all kinds) are either false positives, or cannot be changed without diverging with upstream `alloc` or would make things look worse. ## Patch series status The Rust support is still to be considered experimental. However, support is good enough that kernel developers can start working on the Rust abstractions for subsystems and write drivers and other modules. The current series will appear in the next `linux-next`, as usual. Similarly, the preview docs for this series can be seen at: https://rust-for-linux.github.io/docs/kernel/ As usual, please see the following link for the live list of unstable Rust features we are using: https://github.com/Rust-for-Linux/linux/issues/2 ## Conferences, meetings and liaisons Join us in LPC 2022 (Linux Plumbers Conference) for the Rust MC (microconference)! The schedule is available at: https://lpc.events/event/16/sessions/150/ We will be talking about GCC Rust (the Rust frontend for GCC), `rustc_codegen_gcc` (the GCC backend for `rustc`), Rust for Linux, the Rust NVMe driver, the integration of Rust with the Kernel Testing Service and Rust in the Kernel (via eBPF). In addition, I would like to personally thank Google and ISRG (Internet Security Research Group) for sponsoring Kangrejos, the Rust for Linux workshop: https://kangrejos.com Furthermore, we would like to thank the venues we were invited to: - Linux Foundation Live Mentorship Series - Open Source Summit North America - Huawei Global Software Technology Summit ## Related news The GCC Steering Committee accepted the contribution of the Rust frontend (GCC Rust). Its first released version (experimental, disabled by default) should appear in GCC 13. The first round of patches has been posted to the gcc-patches mailing list. `rustc_codegen_gcc` (the GCC backend for `rustc`) has seen enough progress on SIMD support to compile `stdarch`. In addition, more prerequisite patches are making their way into GCC. ## Acknowledgements The signatures in the main commits correspond to the people that wrote code that has ended up in them at the present time. For details on contributions to code and discussions, please see our repository: https://github.com/Rust-for-Linux/linux However, we would like to give credit to everyone that has contributed in one way or another to the Rust for Linux project. Since the previous cover letter: - Nick Desaulniers, Joe Perches, Masahiro Yamada and Jarkko Sakkinen for their reviews of some of the v7 patches. - Daniel Latypov, Brendan Higgins and Shuah Khan for picking up the KUnit prerequisite patch. - As usual, Björn Roy Baron (bjorn3) and Gary Guo for all the input on Rust compiler details, reviews and suggestions. - Andreas Hindborg for working on the NVMe driver, as well as adding atomic allocations for `Box` and allowing to use GFP flags for `KernelAllocator`. - Li Hongyu for working on a virtio abstraction. - Boqun Feng for working on adding an alloc alignment test. - Andreas Reindl for working on adding missing `SAFETY` comments. - Anhad Singh for working on adding the `new_with_flags` method to `Pages`. - Finn Behrens for working on making it possible to compile the kernel on macOS with Rust enabled. - Roel Kluin for working on code refactorings. - Wei Liu for taking the time to answer questions from newcomers in Zulip. - Philip Li, Yujie Liu et al. for continuing their work on adding Rust support to the Intel 0DAY/LKP kernel test robot. - Philip Herron and Arthur Cohen (and his supporters Open Source Security and Embecosm) et al. for their ongoing work on GCC Rust. - Antoni Boucher (and his supporters) et al. for their ongoing work on `rustc_codegen_gcc`. - Emilio Cobos Álvarez et. al. for their work on `bindgen`, including on issues that affect the kernel. - Mats Larsen, Marc Poulhiès et al. for their ongoing work on improving Rust support in Compiler Explorer. - Many folks that have reported issues, tested the project, helped spread the word, joined discussions and contributed in other ways! Please see also the acknowledgements on the previous cover letters. Boqun Feng (2): kallsyms: use `sizeof` instead of hardcoded size kallsyms: avoid hardcoding buffer size Gary Guo (2): rust: add `build_error` crate vsprintf: add new `%pA` format specifier Miguel Ojeda (19): kallsyms: add static relationship between `KSYM_NAME_LEN{,_BUFFER}` kallsyms: support "big" kernel symbols kallsyms: increase maximum kernel symbol length to 512 rust: add C helpers rust: add `compiler_builtins` crate rust: import upstream `alloc` crate rust: adapt `alloc` crate to the kernel rust: add `macros` crate rust: add `bindings` crate rust: export generated symbols scripts: checkpatch: diagnose uses of `%pA` in the C side as errors scripts: checkpatch: enable language-independent checks for Rust scripts: add `rustdoc_test_{builder,gen}.py` scripts scripts: add `generate_rust_analyzer.py` scripts scripts: decode_stacktrace: demangle Rust symbols docs: add Rust documentation Kbuild: add Rust support samples: add Rust examples MAINTAINERS: Rust Wedson Almeida Filho (8): workqueue: introduce `__INIT_WORK_WITH_KEY` locking/spinlock: introduce `__spin_lock_init` locking/spinlock: introduce `_raw_spin_lock_init` rust: add `kernel` crate's `sync` module rust: add `kernel` crate configs: add `rust` config [RFC] drivers: gpio: PrimeCell PL061 in Rust [RFC] drivers: android: Binder IPC in Rust .gitignore | 6 + .rustfmt.toml | 12 + Documentation/core-api/printk-formats.rst | 10 + Documentation/doc-guide/kernel-doc.rst | 3 + Documentation/index.rst | 1 + Documentation/kbuild/kbuild.rst | 17 + Documentation/kbuild/makefiles.rst | 50 +- Documentation/process/changes.rst | 41 + Documentation/rust/arch-support.rst | 23 + Documentation/rust/coding-guidelines.rst | 216 ++ Documentation/rust/general-information.rst | 79 + Documentation/rust/index.rst | 22 + Documentation/rust/quick-start.rst | 232 ++ MAINTAINERS | 15 + Makefile | 172 +- arch/Kconfig | 6 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 1 + arch/powerpc/Kconfig | 1 + arch/riscv/Kconfig | 1 + arch/riscv/Makefile | 5 + arch/um/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/x86/Makefile | 10 + drivers/android/Kconfig | 6 + drivers/android/Makefile | 2 + drivers/android/allocation.rs | 266 ++ drivers/android/context.rs | 80 + drivers/android/defs.rs | 99 + drivers/android/node.rs | 476 +++ drivers/android/process.rs | 961 +++++ drivers/android/range_alloc.rs | 189 + drivers/android/rust_binder.rs | 106 + drivers/android/thread.rs | 871 +++++ drivers/android/transaction.rs | 326 ++ drivers/gpio/Kconfig | 8 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio_pl061_rust.rs | 367 ++ include/linux/compiler_types.h | 6 +- include/linux/kallsyms.h | 2 +- include/linux/spinlock.h | 17 +- include/linux/workqueue.h | 21 +- include/uapi/linux/android/binder.h | 30 +- init/Kconfig | 46 +- kernel/configs/rust.config | 1 + kernel/kallsyms.c | 26 +- kernel/livepatch/core.c | 4 +- lib/Kconfig.debug | 82 + lib/vsprintf.c | 13 + rust/.gitignore | 10 + rust/Makefile | 415 +++ rust/alloc/README.md | 33 + rust/alloc/alloc.rs | 440 +++ rust/alloc/borrow.rs | 498 +++ rust/alloc/boxed.rs | 2026 +++++++++++ rust/alloc/boxed/thin.rs | 219 ++ rust/alloc/collections/mod.rs | 156 + rust/alloc/ffi/c_str.rs | 1203 ++++++ rust/alloc/ffi/mod.rs | 93 + rust/alloc/fmt.rs | 614 ++++ rust/alloc/lib.rs | 239 ++ rust/alloc/macros.rs | 128 + rust/alloc/raw_vec.rs | 567 +++ rust/alloc/slice.rs | 1295 +++++++ rust/alloc/str.rs | 641 ++++ rust/alloc/string.rs | 2944 +++++++++++++++ rust/alloc/vec/drain.rs | 186 + rust/alloc/vec/drain_filter.rs | 145 + rust/alloc/vec/into_iter.rs | 365 ++ rust/alloc/vec/is_zero.rs | 120 + rust/alloc/vec/mod.rs | 3420 ++++++++++++++++++ rust/alloc/vec/partial_eq.rs | 49 + rust/alloc/vec/set_len_on_drop.rs | 30 + rust/alloc/vec/spec_extend.rs | 174 + rust/bindgen_parameters | 21 + rust/bindings/bindings_helper.h | 49 + rust/bindings/lib.rs | 57 + rust/build_error.rs | 29 + rust/compiler_builtins.rs | 79 + rust/exports.c | 21 + rust/helpers.c | 679 ++++ rust/kernel/allocator.rs | 64 + rust/kernel/amba.rs | 261 ++ rust/kernel/build_assert.rs | 83 + rust/kernel/chrdev.rs | 206 ++ rust/kernel/clk.rs | 79 + rust/kernel/cred.rs | 46 + rust/kernel/delay.rs | 104 + rust/kernel/device.rs | 527 +++ rust/kernel/driver.rs | 442 +++ rust/kernel/error.rs | 564 +++ rust/kernel/file.rs | 887 +++++ rust/kernel/fs.rs | 846 +++++ rust/kernel/fs/param.rs | 553 +++ rust/kernel/gpio.rs | 505 +++ rust/kernel/hwrng.rs | 210 ++ rust/kernel/io_buffer.rs | 153 + rust/kernel/io_mem.rs | 278 ++ rust/kernel/iov_iter.rs | 81 + rust/kernel/irq.rs | 681 ++++ rust/kernel/kasync.rs | 50 + rust/kernel/kasync/executor.rs | 154 + rust/kernel/kasync/executor/workqueue.rs | 291 ++ rust/kernel/kasync/net.rs | 322 ++ rust/kernel/kunit.rs | 91 + rust/kernel/lib.rs | 267 ++ rust/kernel/linked_list.rs | 247 ++ rust/kernel/miscdev.rs | 290 ++ rust/kernel/mm.rs | 149 + rust/kernel/module_param.rs | 499 +++ rust/kernel/net.rs | 392 ++ rust/kernel/net/filter.rs | 447 +++ rust/kernel/of.rs | 63 + rust/kernel/pages.rs | 144 + rust/kernel/platform.rs | 223 ++ rust/kernel/power.rs | 118 + rust/kernel/prelude.rs | 36 + rust/kernel/print.rs | 406 +++ rust/kernel/random.rs | 42 + rust/kernel/raw_list.rs | 361 ++ rust/kernel/rbtree.rs | 563 +++ rust/kernel/revocable.rs | 425 +++ rust/kernel/security.rs | 38 + rust/kernel/static_assert.rs | 34 + rust/kernel/std_vendor.rs | 161 + rust/kernel/str.rs | 597 +++ rust/kernel/sync.rs | 169 + rust/kernel/sync/arc.rs | 582 +++ rust/kernel/sync/condvar.rs | 140 + rust/kernel/sync/guard.rs | 159 + rust/kernel/sync/locked_by.rs | 111 + rust/kernel/sync/mutex.rs | 149 + rust/kernel/sync/nowait.rs | 188 + rust/kernel/sync/rcu.rs | 52 + rust/kernel/sync/revocable.rs | 246 ++ rust/kernel/sync/rwsem.rs | 196 + rust/kernel/sync/seqlock.rs | 201 + rust/kernel/sync/smutex.rs | 290 ++ rust/kernel/sync/spinlock.rs | 357 ++ rust/kernel/sysctl.rs | 199 + rust/kernel/task.rs | 239 ++ rust/kernel/types.rs | 705 ++++ rust/kernel/unsafe_list.rs | 680 ++++ rust/kernel/user_ptr.rs | 175 + rust/kernel/workqueue.rs | 512 +++ rust/macros/concat_idents.rs | 23 + rust/macros/helpers.rs | 79 + rust/macros/lib.rs | 191 + rust/macros/module.rs | 655 ++++ rust/macros/vtable.rs | 95 + samples/Kconfig | 2 + samples/Makefile | 1 + samples/rust/Kconfig | 165 + samples/rust/Makefile | 19 + samples/rust/hostprogs/.gitignore | 3 + samples/rust/hostprogs/Makefile | 5 + samples/rust/hostprogs/a.rs | 7 + samples/rust/hostprogs/b.rs | 5 + samples/rust/hostprogs/single.rs | 12 + samples/rust/rust_chrdev.rs | 49 + samples/rust/rust_echo_server.rs | 60 + samples/rust/rust_fs.rs | 59 + samples/rust/rust_minimal.rs | 35 + samples/rust/rust_miscdev.rs | 142 + samples/rust/rust_module_parameters.rs | 69 + samples/rust/rust_netfilter.rs | 54 + samples/rust/rust_platform.rs | 22 + samples/rust/rust_print.rs | 54 + samples/rust/rust_random.rs | 60 + samples/rust/rust_selftests.rs | 99 + samples/rust/rust_semaphore.rs | 170 + samples/rust/rust_semaphore_c.c | 212 ++ samples/rust/rust_stack_probing.rs | 36 + samples/rust/rust_sync.rs | 93 + scripts/.gitignore | 1 + scripts/Kconfig.include | 6 +- scripts/Makefile | 3 + scripts/Makefile.build | 60 + scripts/Makefile.debug | 10 + scripts/Makefile.host | 34 +- scripts/Makefile.lib | 12 + scripts/Makefile.modfinal | 8 +- scripts/cc-version.sh | 12 +- scripts/checkpatch.pl | 12 +- scripts/decode_stacktrace.sh | 14 + scripts/generate_rust_analyzer.py | 141 + scripts/generate_rust_target.rs | 232 ++ scripts/is_rust_module.sh | 16 + scripts/kallsyms.c | 47 +- scripts/kconfig/confdata.c | 75 + scripts/min-tool-version.sh | 6 + scripts/rust-is-available-bindgen-libclang.h | 2 + scripts/rust-is-available.sh | 160 + scripts/rustdoc_test_builder.py | 59 + scripts/rustdoc_test_gen.py | 164 + tools/include/linux/kallsyms.h | 2 +- tools/lib/perf/include/perf/event.h | 2 +- tools/lib/symbol/kallsyms.h | 2 +- 198 files changed, 43688 insertions(+), 75 deletions(-) create mode 100644 .rustfmt.toml create mode 100644 Documentation/rust/arch-support.rst create mode 100644 Documentation/rust/coding-guidelines.rst create mode 100644 Documentation/rust/general-information.rst create mode 100644 Documentation/rust/index.rst create mode 100644 Documentation/rust/quick-start.rst create mode 100644 drivers/android/allocation.rs create mode 100644 drivers/android/context.rs create mode 100644 drivers/android/defs.rs create mode 100644 drivers/android/node.rs create mode 100644 drivers/android/process.rs create mode 100644 drivers/android/range_alloc.rs create mode 100644 drivers/android/rust_binder.rs create mode 100644 drivers/android/thread.rs create mode 100644 drivers/android/transaction.rs create mode 100644 drivers/gpio/gpio_pl061_rust.rs create mode 100644 kernel/configs/rust.config create mode 100644 rust/.gitignore create mode 100644 rust/Makefile create mode 100644 rust/alloc/README.md create mode 100644 rust/alloc/alloc.rs create mode 100644 rust/alloc/borrow.rs create mode 100644 rust/alloc/boxed.rs create mode 100644 rust/alloc/boxed/thin.rs create mode 100644 rust/alloc/collections/mod.rs create mode 100644 rust/alloc/ffi/c_str.rs create mode 100644 rust/alloc/ffi/mod.rs create mode 100644 rust/alloc/fmt.rs create mode 100644 rust/alloc/lib.rs create mode 100644 rust/alloc/macros.rs create mode 100644 rust/alloc/raw_vec.rs create mode 100644 rust/alloc/slice.rs create mode 100644 rust/alloc/str.rs create mode 100644 rust/alloc/string.rs create mode 100644 rust/alloc/vec/drain.rs create mode 100644 rust/alloc/vec/drain_filter.rs create mode 100644 rust/alloc/vec/into_iter.rs create mode 100644 rust/alloc/vec/is_zero.rs create mode 100644 rust/alloc/vec/mod.rs create mode 100644 rust/alloc/vec/partial_eq.rs create mode 100644 rust/alloc/vec/set_len_on_drop.rs create mode 100644 rust/alloc/vec/spec_extend.rs create mode 100644 rust/bindgen_parameters create mode 100644 rust/bindings/bindings_helper.h create mode 100644 rust/bindings/lib.rs create mode 100644 rust/build_error.rs create mode 100644 rust/compiler_builtins.rs create mode 100644 rust/exports.c create mode 100644 rust/helpers.c create mode 100644 rust/kernel/allocator.rs create mode 100644 rust/kernel/amba.rs create mode 100644 rust/kernel/build_assert.rs create mode 100644 rust/kernel/chrdev.rs create mode 100644 rust/kernel/clk.rs create mode 100644 rust/kernel/cred.rs create mode 100644 rust/kernel/delay.rs create mode 100644 rust/kernel/device.rs create mode 100644 rust/kernel/driver.rs create mode 100644 rust/kernel/error.rs create mode 100644 rust/kernel/file.rs create mode 100644 rust/kernel/fs.rs create mode 100644 rust/kernel/fs/param.rs create mode 100644 rust/kernel/gpio.rs create mode 100644 rust/kernel/hwrng.rs create mode 100644 rust/kernel/io_buffer.rs create mode 100644 rust/kernel/io_mem.rs create mode 100644 rust/kernel/iov_iter.rs create mode 100644 rust/kernel/irq.rs create mode 100644 rust/kernel/kasync.rs create mode 100644 rust/kernel/kasync/executor.rs create mode 100644 rust/kernel/kasync/executor/workqueue.rs create mode 100644 rust/kernel/kasync/net.rs create mode 100644 rust/kernel/kunit.rs create mode 100644 rust/kernel/lib.rs create mode 100644 rust/kernel/linked_list.rs create mode 100644 rust/kernel/miscdev.rs create mode 100644 rust/kernel/mm.rs create mode 100644 rust/kernel/module_param.rs create mode 100644 rust/kernel/net.rs create mode 100644 rust/kernel/net/filter.rs create mode 100644 rust/kernel/of.rs create mode 100644 rust/kernel/pages.rs create mode 100644 rust/kernel/platform.rs create mode 100644 rust/kernel/power.rs create mode 100644 rust/kernel/prelude.rs create mode 100644 rust/kernel/print.rs create mode 100644 rust/kernel/random.rs create mode 100644 rust/kernel/raw_list.rs create mode 100644 rust/kernel/rbtree.rs create mode 100644 rust/kernel/revocable.rs create mode 100644 rust/kernel/security.rs create mode 100644 rust/kernel/static_assert.rs create mode 100644 rust/kernel/std_vendor.rs create mode 100644 rust/kernel/str.rs create mode 100644 rust/kernel/sync.rs create mode 100644 rust/kernel/sync/arc.rs create mode 100644 rust/kernel/sync/condvar.rs create mode 100644 rust/kernel/sync/guard.rs create mode 100644 rust/kernel/sync/locked_by.rs create mode 100644 rust/kernel/sync/mutex.rs create mode 100644 rust/kernel/sync/nowait.rs create mode 100644 rust/kernel/sync/rcu.rs create mode 100644 rust/kernel/sync/revocable.rs create mode 100644 rust/kernel/sync/rwsem.rs create mode 100644 rust/kernel/sync/seqlock.rs create mode 100644 rust/kernel/sync/smutex.rs create mode 100644 rust/kernel/sync/spinlock.rs create mode 100644 rust/kernel/sysctl.rs create mode 100644 rust/kernel/task.rs create mode 100644 rust/kernel/types.rs create mode 100644 rust/kernel/unsafe_list.rs create mode 100644 rust/kernel/user_ptr.rs create mode 100644 rust/kernel/workqueue.rs create mode 100644 rust/macros/concat_idents.rs create mode 100644 rust/macros/helpers.rs create mode 100644 rust/macros/lib.rs create mode 100644 rust/macros/module.rs create mode 100644 rust/macros/vtable.rs create mode 100644 samples/rust/Kconfig create mode 100644 samples/rust/Makefile create mode 100644 samples/rust/hostprogs/.gitignore create mode 100644 samples/rust/hostprogs/Makefile create mode 100644 samples/rust/hostprogs/a.rs create mode 100644 samples/rust/hostprogs/b.rs create mode 100644 samples/rust/hostprogs/single.rs create mode 100644 samples/rust/rust_chrdev.rs create mode 100644 samples/rust/rust_echo_server.rs create mode 100644 samples/rust/rust_fs.rs create mode 100644 samples/rust/rust_minimal.rs create mode 100644 samples/rust/rust_miscdev.rs create mode 100644 samples/rust/rust_module_parameters.rs create mode 100644 samples/rust/rust_netfilter.rs create mode 100644 samples/rust/rust_platform.rs create mode 100644 samples/rust/rust_print.rs create mode 100644 samples/rust/rust_random.rs create mode 100644 samples/rust/rust_selftests.rs create mode 100644 samples/rust/rust_semaphore.rs create mode 100644 samples/rust/rust_semaphore_c.c create mode 100644 samples/rust/rust_stack_probing.rs create mode 100644 samples/rust/rust_sync.rs create mode 100755 scripts/generate_rust_analyzer.py create mode 100644 scripts/generate_rust_target.rs create mode 100755 scripts/is_rust_module.sh create mode 100644 scripts/rust-is-available-bindgen-libclang.h create mode 100755 scripts/rust-is-available.sh create mode 100755 scripts/rustdoc_test_builder.py create mode 100755 scripts/rustdoc_test_gen.py base-commit: 3d7cb6b04c3f3115719235cc6866b10326de34cd -- 2.37.1 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 656C9C19F2A for ; Tue, 2 Aug 2022 01:52:14 +0000 (UTC) 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:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=Xqw9mWxEm4gIbjdrDGYfSCrgm34HVIJ7//wr8Yjncbk=; b=wK1zMcbvT3Cq2C amj0ludQ17Z1sMojei2mV9CD7ni/FLB5gBddsaoj115zeQnonO6GORyJ0fNfArkjrCWPKuN+s7ZbO 22/TyD1tPucqYkX7vkLs8NECBGlcwWs9upEAAyzFTxm0YuSPseKUDd7kZW3+jE2b86e3kSwn7Ykdt UYsoiuObjup8wOieIuMYrFR5nJZWtked+bO6Buz/+Wb23nz2anQbm8ZmnpLyuUja94DSNmIH+faGe snLcf/eGweYRHQ6sy963MGATGRVNCPX7SvmyO5TSb0OKor2vUJt0ediGT6+T17l85L1V5fHwTBdpz 7+6JIcRN/EnB0ozvGVpg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oIh4g-009mqs-Dn; Tue, 02 Aug 2022 01:51:58 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oIh4M-009mmG-QC; Tue, 02 Aug 2022 01:51:43 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 544F6CE16F0; Tue, 2 Aug 2022 01:51:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C087AC433D6; Tue, 2 Aug 2022 01:51:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1659405089; bh=3xVDpblfOW7CRBHtYe2gNVEKPz4HST8R7lJSNE6BaVE=; h=From:To:Cc:Subject:Date:From; b=GVKBjD1EJN4dOLawblA1z8mMlS1FDXGh2nbXJ/tOvHoLFcgGwcyIEfnaOnDsfo1ce gNtXgUcCnaFdG2kL6xTigY1xJHR/EvTD2f+fv45wtjK76opvDViK6FgkmkYn++RSSj vU/OlgZV9zEI8z+Vgppc3bWsCWF+QsehqAiVd17dMbAsx7QJAzHBGYcgYgKi/Ax0Mc gCtkFh1ScY2phKKmSeDZQSJh1FWwybHhMK1j2IrTsSmKGbvhNs0odtcK+tOJgtXroU OxnZfC2VWvt2/OTCg6FuqeVyx4SWCVhisFEcI1LURYsHYyxqhxlKqsWzizpNzr9qN6 mcmhY+Y9LnIdQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-um@lists.infradead.org, live-patching@vger.kernel.org Subject: [PATCH v8 00/31] Rust support Date: Tue, 2 Aug 2022 03:49:47 +0200 Message-Id: <20220802015052.10452-1-ojeda@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220801_185139_272000_55F620A4 X-CRM114-Status: GOOD ( 37.88 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org UnVzdCBzdXBwb3J0CgpUaGlzIGlzIHRoZSBwYXRjaCBzZXJpZXMgKHY4KSB0byBhZGQgc3VwcG9y dCBmb3IgUnVzdCBhcyBhIHNlY29uZApsYW5ndWFnZSB0byB0aGUgTGludXgga2VybmVsLgoKSWYg eW91IGFyZSBpbnRlcmVzdGVkIGluIGZvbGxvd2luZyB0aGlzIGVmZm9ydCwgcGxlYXNlIGpvaW4g dXMgaW4KdGhlIG1haWxpbmcgbGlzdCBhdDoKCiAgICBydXN0LWZvci1saW51eEB2Z2VyLmtlcm5l bC5vcmcKCmFuZCB0YWtlIGEgbG9vayBhdCB0aGUgcHJvamVjdCBpdHNlbGYgYXQ6CgogICAgaHR0 cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4CgpBcyB1c3VhbCwgc3BlY2lhbCB0aGFua3Mg Z28gdG8gSVNSRyAoSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gKR3JvdXApIGFuZCBHb29nbGUg Zm9yIHRoZWlyIGZpbmFuY2lhbCBzdXBwb3J0IG9uIHRoaXMgZW5kZWF2b3IuCgpDaGVlcnMsCk1p Z3VlbAoKLS0KCiMgUnVzdCBzdXBwb3J0CgpUaGlzIGNvdmVyIGxldHRlciBleHBsYWlucyB0aGUg bWFqb3IgY2hhbmdlcyBhbmQgdXBkYXRlcyBkb25lIHNpbmNlCnRoZSBwcmV2aW91cyBvbmVzLiBG b3IgdGhvc2UsIHBsZWFzZSBzZWU6CgogICAgUkZDOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9s a21sLzIwMjEwNDE0MTg0NjA0LjIzNDczLTEtb2plZGFAa2VybmVsLm9yZy8KICAgIHYxOiAgaHR0 cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIxMDcwNDIwMjc1Ni4yOTEwNy0xLW9qZWRhQGtl cm5lbC5vcmcvCiAgICB2MjogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTEyMDYx NDAzMTMuNTY1My0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2MzogIGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xrbWwvMjAyMjAxMTcwNTMzNDkuNjgwNC0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2 NDogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjAyMTIxMzA0MTAuNjkwMS0xLW9q ZWRhQGtlcm5lbC5vcmcvCiAgICB2NTogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAy MjAzMTcxODEwMzIuMTU0MzYtMS1vamVkYUBrZXJuZWwub3JnLwogICAgdjY6ICBodHRwczovL2xv cmUua2VybmVsLm9yZy9sa21sLzIwMjIwNTA3MDUyNDUxLjEyODkwLTEtb2plZGFAa2VybmVsLm9y Zy8KICAgIHY3OiAgaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIyMDUyMzAyMDIwOS4x MTgxMC0xLW9qZWRhQGtlcm5lbC5vcmcvCgoKIyMgSW5mcmFzdHJ1Y3R1cmUgdXBkYXRlcwoKVGhl cmUgaGF2ZSBiZWVuIHNldmVyYWwgaW1wcm92ZW1lbnRzIHRvIHRoZSBvdmVyYWxsIFJ1c3Qgc3Vw cG9ydDoKCiAgLSBVcGdyYWRlZCB0b29sY2hhaW4gYW5kIGBhbGxvY2AgdG8gUnVzdCAxLjYyLjAg ZnJvbSAxLjYwLjAuCiAgICBSdXN0IDEuNjEuMCBzdGFiaWxpemVkIGBmZWF0dXJlKGNvbnN0X2Zu X3RyYWl0X2JvdW5kKWAgdGhhdAogICAgd2UgYXJlIHVzaW5nLgoKICAtIE1vdmVkIGJpbmRpbmdz IGludG8gdGhlaXIgb3duIGNyYXRlLCBgYmluZGluZ3NgLiBUaGlzIGdyZWF0bHkKICAgIGltcHJv dmVzIGJ1aWxkIHRpbWUgd2hlbiBvbmx5IHRoZSBga2VybmVsYCBjcmF0ZSBjaGFuZ2VzICh3aGlj aAogICAgcHJldmlvdXNseSBjb250YWluZWQgdGhlIGJpbmRpbmdzKS4KCiAgLSBEaXNhYmxlZCB1 bnVzZWQgYGJpbmRnZW5gJ3MgbGF5b3V0IHRlc3QgZ2VuZXJhdGlvbiwgd2hpY2ggbWFrZXMKICAg IHJ1c3QtYW5hbHl6ZXIgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdG8gcnVuLgoKICAtIGBiaW5kZ2Vu YCBjYW4gbm93IGJlIGRldGVjdGVkIHZpYSB0aGUgYF9fQklOREdFTl9fYCBtYWNybywgd2hpY2gK ICAgIHdlIGN1cnJlbnRseSB1c2UgdG8gd29ya2Fyb3VuZCBhbiBpc3N1ZSB3aXRoIHRoZSBgYnRm X3R5cGVfdGFnYAogICAgYXR0cmlidXRlLgoKICAtIFJlaW1wbGVtZW50ZWQgYGNvbmNhdF9pZGVu dHMhYCAoYW4gdW5zdGFibGUgc3RhbmRhcmQgbGlicmFyeQogICAgbWFjcm8pIGFzIGEgcHJvYyBt YWNybywgd2hpY2ggbWVhbnMgd2Ugbm8gbG9uZ2VyIHJlbHkgb24KICAgIGBmZWF0dXJlKGNvbmNh dF9pZGVudHMpYC4gRnVydGhlcm1vcmUsIHRoZSBwcm9jIG1hY3JvIGFsbG93cwogICAgdG8gcmVm ZXIgdG8gbG9jYWwgdmFyaWFibGVzLgoKICAtIFJlaW1wbGVtZW50ZWQgYHN0YXRpY19hc3NlcnQh YCBpbiBhIG1vcmUgaWRpb21hdGljIHdheSwgbm93IHRoYXQKICAgIGBjb3JlOjphc3NlcnQhKClg IGlzIHN1cHBvcnRlZCBpbiBjb25zdCBjb250ZXh0cy4KCiAgLSBNYWRlIGBidWlsZF9lcnJvciFg JyB3b3JrIHVuZGVyIGBSVVNUX0JVSUxEX0FTU0VSVF97V0FSTixBTExPV31gCiAgICBmb3IgbW9k dWxlcy4KCiAgLSBSZW1vdmVkIGBfX211bG9kaTRgIHBhbmlja2luZyBzdHViLgoKICAtIEFkZGVk IGBrZXJuZWwvY29uZmlncy9ydXN0LmNvbmZpZ2AuCgogIC0gQWRkZWQgYSAodGVtcG9yYXJ5KSBz ZWxmLXRlc3QgbW9kdWxlIGZvciAicHVyZSIgUnVzdCB0ZXN0cy4KCiAgLSBDaGFuZ2VkIGAuaWAg bWFjcm8gZXhwYW5kZWQgZmlsZXMgdG8gdGhlIGAucnNpYCBleHRlbnNpb24gYW5kCiAgICBjbGFy aWZpZWQgdGhhdCB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgY29tcGlsYWJsZS4KCiAgLSBE cm9wcGVkIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB0aGUgUnVzdCBzaWRlIHdpdGggYSBkaWZmZXJl bnQKICAgIG9wdGltaXphdGlvbiBsZXZlbCB0aGFuIHRoZSBDIHNpZGUuCgogIC0gVGhlIExpbnV4 L1R1eCBTVkcgbG9nbyAocmVjZW50bHkgdXBzdHJlYW1lZCkgaXMgdXNlZCBmb3IKICAgIHRoZSBn ZW5lcmF0ZWQgUnVzdCBkb2N1bWVudGF0aW9uLCBpbnN0ZWFkIG9mIHRoZSBHSUYgb25lLgogICAg VGhlIGBDT1BZSU5HLWxvZ29gIGZpbGUgaXMgYnVuZGxlZCB0b28uCgogIC0gT3RoZXIgY2xlYW51 cHMsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMuCgoKIyMgQWJzdHJhY3Rpb25zIGFuZCBkcml2ZXIg dXBkYXRlcwoKU29tZSBvZiB0aGUgaW1wcm92ZW1lbnRzIHRvIHRoZSBhYnN0cmFjdGlvbnMgYW5k IGV4YW1wbGUgZHJpdmVycyBhcmU6CgogIC0gRmlsZXN5c3RlbSBzdXBwb3J0IChgZnNgIG1vZHVs ZSksIGluY2x1ZGluZzoKCiAgICAgICsgYElOb2RlYCB0eXBlICh3aGljaCB3cmFwcyBgc3RydWN0 IGlub2RlYCkuCiAgICAgICsgYERFbnRyeWAgdHlwZSAod2hpY2ggd3JhcHMgYHN0cnVjdCBkZW50 cnlgKS4KICAgICAgKyBgRmlsZW5hbWVgIHR5cGUgKHdoaWNoIHdyYXBzIGBzdHJ1Y3QgZmlsZW5h bWVgKS4KICAgICAgKyBgUmVnaXN0cmF0aW9uYCB0eXBlLgogICAgICArIGBUeXBlYCBhbmQgYENv bnRleHRgIHRyYWl0cy4KICAgICAgKyBgU3VwZXJCbG9ja2AgdHlwZSAod2hpY2ggd3JhcHMgYHN0 cnVjdCBzdXBlcl9ibG9ja2AgYW5kIHRha2VzCiAgICAgICAgYWR2YW50YWdlIG9mIHR5cGVzdGF0 ZXMgZm9yIGl0cyBpbml0aWFsaXphdGlvbikuCiAgICAgICsgRmlsZSBzeXN0ZW0gcGFyYW1ldGVy cyBzdXBwb3J0ICh3aXRoIGEgYFZhbHVlYCBlbnVtOyBgU3BlYypgCiAgICAgICAgYW5kIGBDb25z dGFudCpgIHR5cGVzLCBgZGVmaW5lX2ZzX3BhcmFtcyFgIG1hY3JvLi4uKS4KICAgICAgKyBGaWxl IHN5c3RlbSBmbGFncy4KICAgICAgKyBgbW9kdWxlX2ZzIWAgbWFjcm8gdG8gc2ltcGxpZnkgcmVn aXN0ZXJpbmcga2VybmVsIG1vZHVsZXMgdGhhdAogICAgICAgIG9ubHkgaW1wbGVtZW50IGEgc2lu Z2xlIGZpbGUgc3lzdGVtLgogICAgICArIEEgZmlsZSBzeXN0ZW0gc2FtcGxlLgoKICAtIFdvcmtx dWV1ZXMgc3VwcG9ydCAoYHdvcmtxdWV1ZWAgbW9kdWxlKSwgaW5jbHVkaW5nIGEgYFdvcmtgIHR5 cGUKICAgICh3aGljaCB3cmFwcyBgc3RydWN0IHdvcmtfc3RydWN0YCksIGEgYFF1ZXVlYCB0eXBl ICh3aGljaCB3cmFwcwogICAgYHN0cnVjdCB3b3JrcXVldWVfc3RydWN0YCksIGFjY2VzcyB0byBk aWZmZXJlbnQgc3lzdGVtIHF1ZXVlcyBhcwogICAgd2VsbCBhcyBtYWNyb3MgdG8gc2ltcGxpZnkg dXNhZ2UsIGUuZy46CgogICAgICAgIHNwYXduX3dvcmtfaXRlbSEod29ya3F1ZXVlOjpzeXN0ZW0o KSwgfHwgcHJfaW5mbyEoIkhpIVxuIikpPzsKCiAgLSBNb3JlIGFzeW5jaHJvbm91cyBzdXBwb3J0 IChga2FzeW5jYCBtb2R1bGUpLCBpbmNsdWRpbmc6CgogICAgICArIEV4ZWN1dG9yIHN1cHBvcnQg KGluY2x1ZGluZyBgVGFza2AgYW5kIGBFeGVjdXRvcmAgdHJhaXRzLCBhCiAgICAgICAgYEF1dG9T dG9wSGFuZGxlYCB0eXBlIHRoYXQgYXV0b21hdGljYWxseSBzdG9wcyB0aGUgZXhlY3V0b3Igb24K ICAgICAgICBkcm9wLCBhIGBzcGF3bl90YXNrIWAgbWFjcm8gdGhhdCBhdXRvbWF0aWNhbGx5IGRl ZmluZXMgYSBuZXcKICAgICAgICBsb2NrZGVwIGxvY2sgY2xhc3MuLi4pLgoKICAgICAgKyBBIHdv cmtxdWV1ZS1iYXNlZCBleGVjdXRvciwgd2hpY2ggYWxsb3dzIHRvIHJ1biB0YXNrcyBvbgogICAg ICAgIGRlZGljYXRlZCBvciBzaGFyZWQgdGhyZWFkIHBvb2xzIHRoYXQgYXJlIG1hbmFnZWQgYnkg ZXhpc3RpbmcKICAgICAgICBDIGtlcm5lbCBpbmZyYXN0cnVjdHVyZSwgZS5nLjoKCiAgICAgICAg ICAgIGxldCBtdXQgaGFuZGxlID0gRXhlY3V0b3I6OnRyeV9uZXcod29ya3F1ZXVlOjpzeXN0ZW0o KSk/OwoKICAgICAgICAgICAgc3Bhd25fdGFzayEoaGFuZGxlLmV4ZWN1dG9yKCksIGFzeW5jIHsK ICAgICAgICAgICAgICAgIHByX2luZm8hKCJGaXJzdCB3b3JrcXVldWUgdGFza1xuIik7CiAgICAg ICAgICAgIH0pPzsKCiAgICAgICAgICAgIHNwYXduX3Rhc2shKGhhbmRsZS5leGVjdXRvcigpLCBh c3luYyB7CiAgICAgICAgICAgICAgICBwcl9pbmZvISgiU2Vjb25kIHdvcmtxdWV1ZSB0YXNrXG4i KTsKICAgICAgICAgICAgfSk/OwoKICAgICAgICAgICAgaGFuZGxlLmRldGFjaCgpOwoKICAgICAg KyBBIGB5aWVsZF9ub3coKWAgZnVuY3Rpb24gdGhhdCB5aWVsZHMgZXhlY3V0aW9uIG9mIHRoZSBj dXJyZW50CiAgICAgICAgdGFzayBzbyB0aGF0IG90aGVyIG9uZXMgbWF5IGV4ZWN1dGUgKGJ1dCBr ZWVwcyBpdCBydW5uYWJsZSBzbwogICAgICAgIHRoYXQgaXQgd2lsbCBydW4gYWdhaW4gYXMgc29v biBhcyB0aGUgZXhlY3V0b3IgaXMgYXZhaWxhYmxlCiAgICAgICAgYWdhaW4pLCBlLmcuOgoKICAg ICAgICAgICAgYXN5bmMgZm4gZXhhbXBsZSgpIHsKICAgICAgICAgICAgICAgIHByX2luZm8hKCJC ZWZvcmUgeWllbGRcbiIpOwogICAgICAgICAgICAgICAgeWllbGRfbm93KCkuYXdhaXQ7CiAgICAg ICAgICAgICAgICBwcl9pbmZvISgiQWZ0ZXIgeWllbGRcbiIpOwogICAgICAgICAgICB9CgogICAg ICArIGBBc3luY1Jldm9jYWJsZWAgdHlwZSAoaW4gdGhlIGByZXZvY2FibGVgIG1vZHVsZSksIHdo aWNoCiAgICAgICAgYWxsb3dzIGFjY2VzcyB0byBvYmplY3RzIHRvIGJlIHJldm9rZWQgd2l0aG91 dCBoYXZpbmcgdG8gd2FpdAogICAgICAgIGZvciBleGlzdGluZyB1c2VycyB0byBjb21wbGV0ZS4g VGhpcyBpcyB1c2VmdWwgdG8gZHJvcCBmdXR1cmVzCiAgICAgICAgaW4gdGFza3Mgd2hlbiBleGVj dXRvcnMgYXJlIGJlaW5nIHRvcm4gZG93bi4KCiAgICAgICsgQW4gYXN5bmNocm9ub3VzIFRDUCBl Y2hvIHNlcnZlciBzYW1wbGUuCgogIC0gSW50cm9kdWNlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBp bnRlcnJ1cHRzOiBgW1RocmVhZGVkXUhhbmRsZXJgCiAgICB0cmFpdHMsIGBbVGhyZWFkZWRdUmVn aXN0cmF0aW9uYCB0eXBlcywgYSBgUmV0dXJuYCBlbnVtIChhcyB0aGUKICAgIHJldHVybiB2YWx1 ZSBmcm9tIGhhbmRsZXJzKSBhbmQgZmxhZ3M6CgogICAgICAgIHN0cnVjdCBFeGFtcGxlOwoKICAg ICAgICBpbXBsIGlycTo6SGFuZGxlciBmb3IgRXhhbXBsZSB7CiAgICAgICAgICAgIHR5cGUgRGF0 YSA9IEJveDx1MzI+OwoKICAgICAgICAgICAgZm4gaGFuZGxlX2lycShfZGF0YTogJnUzMikgLT4g aXJxOjpSZXR1cm4gewogICAgICAgICAgICAgICAgaXJxOjpSZXR1cm46Ok5vbmUKICAgICAgICAg ICAgfQogICAgICAgIH0KCiAgICAgICAgZm4gcmVxdWVzdF9pcnEoaXJxOiB1MzIsIGRhdGE6IEJv eDx1MzI+KQogICAgICAgICAgLT4gUmVzdWx0PGlycTo6UmVnaXN0cmF0aW9uPEV4YW1wbGU+PiB7 CiAgICAgICAgICAgIGlycTo6UmVnaXN0cmF0aW9uOjp0cnlfbmV3KAogICAgICAgICAgICAgICAg aXJxLCBkYXRhLCBpcnE6OmZsYWdzOjpTSEFSRUQsCiAgICAgICAgICAgICAgICBmbXQhKCJleGFt cGxlX3tpcnF9IikKICAgICAgICAgICAgKQogICAgICAgIH0KCiAgLSBJbnRyb2R1Y2VkIHRoZSBg I1t2dGFibGVdYCBwcm9jIG1hY3JvIGF0dHJpYnV0ZSB0byBzaW1wbGlmeSBob3cKICAgIGZ1bmN0 aW9uIHBvaW50ZXIgdGFibGVzIGxpa2UgYHN0cnVjdCBmaWxlX29wZXJhdGlvbnNgIGFyZSB1c2Vk CiAgICBieSBSdXN0IGtlcm5lbCBtb2R1bGVzLgoKICAgIFByZXZpb3VzbHksIHVzZXJzIGhhZCB0 byBjYWxsIGEgYGRlY2xhcmVfKl9vcGVyYXRpb25zIWAgbWFjcm8KICAgIHdoaWNoIHJlcXVpcmVk IHBhc3NpbmcgdGhlIGRlZmluZWQgb3BlcmF0aW9uczoKCiAgICAgICAgaW1wbCBmaWxlOjpPcGVy YXRpb25zIGZvciBTb21lRmlsZSB7CiAgICAgICAgICAgIC4uLgogICAgICAgICAgICBkZWNsYXJl X2ZpbGVfb3BlcmF0aW9ucyEocmVhZCwgd3JpdGUsIGlvY3RsLCAuLi4pOwogICAgICAgICAgICAu Li4KICAgICAgICB9CgogICAgSW5zdGVhZCwgbm93IGl0IGlzIG9ubHkgcmVxdWlyZWQgdGhhdCB0 aGV5IGFubm90YXRlIHRoZSBgaW1wbGAKICAgIGJsb2NrIHdpdGggdGhlIGF0dHJpYnV0ZToKCiAg ICAgICAgI1t2dGFibGVdCiAgICAgICAgaW1wbCBmaWxlOjpPcGVyYXRpb25zIGZvciBTb21lRmls ZSB7CiAgICAgICAgICAgIC4uLgogICAgICAgIH0KCiAgICBUaGUgcHJvYyBtYWNybyB3aWxsIGdl bmVyYXRlIGEgYm9vbGVhbiBgSEFTXypgIGFzc29jaWF0ZWQgY29uc3RhbnQKICAgIGZvciBlYWNo IG1ldGhvZCBpbiB0aGUgdHJhaXQsIGluZGljYXRpbmcgaWYgdGhlIGltcGxlbWVudGVyIGhhcwog ICAgb3ZlcnJpZGRlbiBhIG1ldGhvZC4KCiAgLSBBZGRlZCBgdW5zYWZlX2xpc3Q6Okxpc3RgLCBh biBpbnRydXNpdmUgY2lyY3VsYXIgZG91Ymx5LWxpbmtlZAogICAgbGlzdCwgbWVhbnQgdG8gYmUg dXNlZCBhcyB0aGUgYmFzaXMgZm9yIG90aGVyIGxpbmtlZCBsaXN0cy4KCiAgICBJdCBpcyBhbHNv IHVzZWQgaW4gdGhlIHdvcmtxdWV1ZS1iYXNlZCBleGVjdXRvciB0byBrZWVwIHRyYWNrIG9mCiAg ICBhbGwgdGFza3Mgc2luY2UgaXQgaXMgY2hlYXBlciB0aGFuIG90aGVyIG9wdGlvbnMuCgogIC0g SW5pdGlhbCBSQ1Ugc3VwcG9ydDogYSBgR3VhcmRgIHR5cGUgdGhhdCByZXByZXNlbnRzIGV2aWRl bmNlIHRoYXQKICAgIHRoZSBSQ1UgcmVhZCBzaWRlIGxvY2sgaXMgaGVsZCBvbiB0aGUgY3VycmVu dCB0aHJlYWQvQ1BVLgoKICAgIEluIGFkZGl0aW9uLCBgUmV2b2NhYmxlYCBub3cgdXNlcyB0aGlz IG5ldyBhYnN0cmFjdGlvbiBzbyB0aGF0CiAgICB1c2VycyBjYW4gcHJvdmlkZSBldmlkZW5jZSBv ZiB0aGUgUkNVIHJlYWQgc2lkZSBsb2NrIGJlaW5nIGhlbGQKICAgIHdoZW4gYWNjZXNzaW5nIHRo ZSBwcm90ZWN0ZWQgb2JqZWN0LCBlLmcuOgoKICAgICAgICBmbiBhZGRfcGFpcih2YWx1ZTogJlJl dm9jYWJsZTwodTMyLCB1MzIpPikgLT4gT3B0aW9uPHUzMj4gewogICAgICAgICAgICBsZXQgZ3Vh cmQgPSByY3U6OnJlYWRfbG9jaygpOwogICAgICAgICAgICBsZXQgcGFpciA9IHZhbHVlLnRyeV9h Y2Nlc3Nfd2l0aF9ndWFyZCgmZ3VhcmQpPzsKICAgICAgICAgICAgU29tZShwYWlyLjAgKyBwYWly LjEpCiAgICAgICAgfQoKICAtIEFkZGVkIGBTdGF0aWNSZWZgIHdoaWNoIGFsbG93cyB0aGUgY3Jl YXRpb24gb2YgInJlZmVyZW5jZS1jb3VudGVkIgogICAgZ2xvYmFsczsgaS5lLiBhbGxvd3MgdG8g ZGVmaW5lIHN0YXRpYyB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXNlZAogICAgd2hlbiBgUmVmPFQ+ YCBvciBgUmVmQm9ycm93PCdfLCBUPmAgYXJlIGV4cGVjdGVkLgoKICAgIFRoaXMsIGluIHR1cm4s IGFsbG93cyB0byBoYXZlIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBzaGFyZWQKICAgIHJlc291cmNl cyAoZS5nLiBhIGdsb2JhbCB3b3JrcXVldWUpIHdpdGhvdXQgYWxsb2NhdGlvbnMgKHRoZQogICAg c2hhcmVkIG9iamVjdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCkuCgogIC0gQWRkZWQgYFRhc2s6 OnNwYXduKClgIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgYXV0b21hdGljYWxseSBydW4KICAgIGtl cm5lbCB0aHJlYWRzIGVhc2lseSwgZS5nLjoKCiAgICAgICAgZm9yIGkgaW4gMC4uMTAgewogICAg ICAgICAgICBUYXNrOjpzcGF3bihmbXQhKCJ0ZXN0e2l9IiksIHRocmVhZGZuKS51bndyYXAoKTsK ICAgICAgICB9CgogIC0gQWRkZWQgYFRhc2s6Ondha2VfdXAoKWAgbWV0aG9kLgoKICAtIENvbnZl cnRlZCBgVGFza2AgdG8gdXNlIGBBUmVmYCB0byB1bmlmeSB0aGUgdXNhZ2Ugb2YgYWxsCiAgICBy ZWYtY291bnRlZCBDIHN0cnVjdHVyZXMuCgogIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBkZWxheXMv c2xlZXBzIChgZGVsYXlgIG1vZHVsZSkgd2l0aCBhIGJhc2ljCiAgICBgY29hcnNlX3NsZWVwKClg IGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIEMgc2lkZSBgbXNsZWVwKClgIGFuZAogICAgdGFrZXMg YWR2YW50YWdlIG9mIHRoZSBgRHVyYXRpb25gIHN0YW5kYXJkIGxpYnJhcnkgdHlwZToKCiAgICAg ICAgY29hcnNlX3NsZWVwKER1cmF0aW9uOjpmcm9tX21pbGxpcygyMCkpOwoKICAtIEFkZGVkIGZp bGUgZmxhZ3MgKHRvIGZ1cnRoZXIgcmVkdWNlIGBiaW5kaW5nczo6KmAgdXNhZ2UpLCBlLmcuOgoK ICAgICAgICBsZXQgYmxvY2tpbmcgPSAoZmlsZS5mbGFncygpICYgZmlsZTo6ZmxhZ3M6Ok9fTk9O QkxPQ0spID09IDA7CgogIC0gQWRkZWQgYGdwaW9fY2hpcF9yZWdpc3RlciFgIGFuZCBgZ3Bpb19p cnFfY2hpcF9yZWdpc3RlciFgIG1hY3JvcwogICAgd2hpY2ggYXV0b21hdGljYWxseSBkZWZpbmUg dGhlIHJlcXVpcmVkIGxvY2sgY2xhc3Nlcy4KCiAgLSBSZW1vdmFsIG9mIGBiaW5kaW5nczo6bG9j a19jbGFzc19rZXlgIGZyb20gZHJpdmVycy4gVGhpcyBnZXRzIHVzCiAgICBjbG9zZXIgdG8gZXZl bnR1YWxseSBtYWtlIGJpbmRpbmdzIHByaXZhdGUgdG8gdGhlIGBrZXJuZWxgIGNyYXRlLgoKICAt IE1vdmVkIHVzYWdlIG9mIGBNYW51YWxseURyb3BgIHRvIGBNYXliZVVuaW5pdGAgaW4gYFJldm9j YWJsZWAsCiAgICB3aGljaCB3YXMgdW5zb3VuZC4KCiAgLSBPdGhlciBjbGVhbnVwcywgZml4ZXMg YW5kIGltcHJvdmVtZW50cy4KCgojIyBQYXRjaCBzZXJpZXMgdXBkYXRlcwoKVGhlIHBhdGNoIHNl cmllcyBoYXMgYmVlbiByZW9yZ2FuaXplZCBhIGJpdCBzaW5jZSBsYXN0IHRpbWU6CgogIC0gVGhl IGBpbmNsdWRlL2xpbnV4L2AgY2hhbmdlcyBmb3IgdGhlIEMgaGVscGVycyBoYXZlIGJlZW4gbW92 ZWQKICAgIGludG8gdGhlaXIgb3duIHNtYWxsIHBhdGNoZXMsIHdoaWNoIGNhbiBiZSB0YWtlbiBp bmRlcGVuZGVudGx5CiAgICBhcyBwcmVyZXF1aXNpdGUgcGF0Y2hlcyBpZiBuZWVkZWQuCgogIC0g Tm93IHRoYXQgdGhlIGJpbmRpbmdzIGFyZSBpbiB0aGVpciBvd24gYGJpbmRpbmdzYCBjcmF0ZSwK ICAgIHRoZXkgYWxzbyBnZXQgdGhlaXIgb3duIHBhdGNoLgoKICAtIFRoZXJlIGlzIGEgbmV3IHBh dGNoIHRoYXQgYWRkcyB0aGUgYGtlcm5lbC9jb25maWdzL3J1c3QuY29uZmlnYC4KCiAgLSBPbmUg b2YgdGhlIGBrYWxsc3ltc2AgcGF0Y2hlcyBoYXMgYmVlbiBzcGxpdCBpbnRvIHRocmVlIHNtYWxs ZXIKICAgIG9uZXMuCgogIC0gQ2xlYW5lZCB1cCBzb21lICJleGNlZWRzIDEwMCBjb2x1bW5zIiBg Y2hlY2twYXRjaC5wbGAgd2FybmluZ3MuCiAgICBXaXRoIHRoaXMgZmluYWwgY2xlYW51cCwgdGhl IHJlbWFpbmluZyB3YXJuaW5ncyAob2YgYWxsIGtpbmRzKQogICAgYXJlIGVpdGhlciBmYWxzZSBw b3NpdGl2ZXMsIG9yIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgZGl2ZXJnaW5nCiAgICB3aXRo IHVwc3RyZWFtIGBhbGxvY2Agb3Igd291bGQgbWFrZSB0aGluZ3MgbG9vayB3b3JzZS4KCgojIyBQ YXRjaCBzZXJpZXMgc3RhdHVzCgpUaGUgUnVzdCBzdXBwb3J0IGlzIHN0aWxsIHRvIGJlIGNvbnNp ZGVyZWQgZXhwZXJpbWVudGFsLiBIb3dldmVyLApzdXBwb3J0IGlzIGdvb2QgZW5vdWdoIHRoYXQg a2VybmVsIGRldmVsb3BlcnMgY2FuIHN0YXJ0IHdvcmtpbmcgb24gdGhlClJ1c3QgYWJzdHJhY3Rp b25zIGZvciBzdWJzeXN0ZW1zIGFuZCB3cml0ZSBkcml2ZXJzIGFuZCBvdGhlciBtb2R1bGVzLgoK VGhlIGN1cnJlbnQgc2VyaWVzIHdpbGwgYXBwZWFyIGluIHRoZSBuZXh0IGBsaW51eC1uZXh0YCwg YXMgdXN1YWwuClNpbWlsYXJseSwgdGhlIHByZXZpZXcgZG9jcyBmb3IgdGhpcyBzZXJpZXMgY2Fu IGJlIHNlZW4gYXQ6CgogICAgaHR0cHM6Ly9ydXN0LWZvci1saW51eC5naXRodWIuaW8vZG9jcy9r ZXJuZWwvCgpBcyB1c3VhbCwgcGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIHRoZSBs aXZlIGxpc3Qgb2YgdW5zdGFibGUKUnVzdCBmZWF0dXJlcyB3ZSBhcmUgdXNpbmc6CgogICAgaHR0 cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4L2xpbnV4L2lzc3Vlcy8yCgoKIyMgQ29uZmVy ZW5jZXMsIG1lZXRpbmdzIGFuZCBsaWFpc29ucwoKSm9pbiB1cyBpbiBMUEMgMjAyMiAoTGludXgg UGx1bWJlcnMgQ29uZmVyZW5jZSkgZm9yIHRoZSBSdXN0IE1DCihtaWNyb2NvbmZlcmVuY2UpISBU aGUgc2NoZWR1bGUgaXMgYXZhaWxhYmxlIGF0OgoKICAgIGh0dHBzOi8vbHBjLmV2ZW50cy9ldmVu dC8xNi9zZXNzaW9ucy8xNTAvCgpXZSB3aWxsIGJlIHRhbGtpbmcgYWJvdXQgR0NDIFJ1c3QgKHRo ZSBSdXN0IGZyb250ZW5kIGZvciBHQ0MpLApgcnVzdGNfY29kZWdlbl9nY2NgICh0aGUgR0NDIGJh Y2tlbmQgZm9yIGBydXN0Y2ApLCBSdXN0IGZvciBMaW51eCwKdGhlIFJ1c3QgTlZNZSBkcml2ZXIs IHRoZSBpbnRlZ3JhdGlvbiBvZiBSdXN0IHdpdGggdGhlIEtlcm5lbCBUZXN0aW5nClNlcnZpY2Ug YW5kIFJ1c3QgaW4gdGhlIEtlcm5lbCAodmlhIGVCUEYpLgoKSW4gYWRkaXRpb24sIEkgd291bGQg bGlrZSB0byBwZXJzb25hbGx5IHRoYW5rIEdvb2dsZSBhbmQgSVNSRwooSW50ZXJuZXQgU2VjdXJp dHkgUmVzZWFyY2ggR3JvdXApIGZvciBzcG9uc29yaW5nIEthbmdyZWpvcywKdGhlIFJ1c3QgZm9y IExpbnV4IHdvcmtzaG9wOgoKICAgIGh0dHBzOi8va2FuZ3Jlam9zLmNvbQoKRnVydGhlcm1vcmUs IHdlIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIHZlbnVlcyB3ZSB3ZXJlIGludml0ZWQgdG86Cgog IC0gTGludXggRm91bmRhdGlvbiBMaXZlIE1lbnRvcnNoaXAgU2VyaWVzCiAgLSBPcGVuIFNvdXJj ZSBTdW1taXQgTm9ydGggQW1lcmljYQogIC0gSHVhd2VpIEdsb2JhbCBTb2Z0d2FyZSBUZWNobm9s b2d5IFN1bW1pdAoKCiMjIFJlbGF0ZWQgbmV3cwoKVGhlIEdDQyBTdGVlcmluZyBDb21taXR0ZWUg YWNjZXB0ZWQgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgUnVzdApmcm9udGVuZCAoR0NDIFJ1c3Qp LiBJdHMgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiAoZXhwZXJpbWVudGFsLApkaXNhYmxlZCBieSBk ZWZhdWx0KSBzaG91bGQgYXBwZWFyIGluIEdDQyAxMy4gVGhlIGZpcnN0IHJvdW5kIG9mCnBhdGNo ZXMgaGFzIGJlZW4gcG9zdGVkIHRvIHRoZSBnY2MtcGF0Y2hlcyBtYWlsaW5nIGxpc3QuCgpgcnVz dGNfY29kZWdlbl9nY2NgICh0aGUgR0NDIGJhY2tlbmQgZm9yIGBydXN0Y2ApIGhhcyBzZWVuIGVu b3VnaApwcm9ncmVzcyBvbiBTSU1EIHN1cHBvcnQgdG8gY29tcGlsZSBgc3RkYXJjaGAuIEluIGFk ZGl0aW9uLCBtb3JlCnByZXJlcXVpc2l0ZSBwYXRjaGVzIGFyZSBtYWtpbmcgdGhlaXIgd2F5IGlu dG8gR0NDLgoKCiMjIEFja25vd2xlZGdlbWVudHMKClRoZSBzaWduYXR1cmVzIGluIHRoZSBtYWlu IGNvbW1pdHMgY29ycmVzcG9uZCB0byB0aGUgcGVvcGxlIHRoYXQKd3JvdGUgY29kZSB0aGF0IGhh cyBlbmRlZCB1cCBpbiB0aGVtIGF0IHRoZSBwcmVzZW50IHRpbWUuIEZvciBkZXRhaWxzCm9uIGNv bnRyaWJ1dGlvbnMgdG8gY29kZSBhbmQgZGlzY3Vzc2lvbnMsIHBsZWFzZSBzZWUgb3VyIHJlcG9z aXRvcnk6CgogICAgaHR0cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4L2xpbnV4CgpIb3dl dmVyLCB3ZSB3b3VsZCBsaWtlIHRvIGdpdmUgY3JlZGl0IHRvIGV2ZXJ5b25lIHRoYXQgaGFzIGNv bnRyaWJ1dGVkCmluIG9uZSB3YXkgb3IgYW5vdGhlciB0byB0aGUgUnVzdCBmb3IgTGludXggcHJv amVjdC4gU2luY2UgdGhlCnByZXZpb3VzIGNvdmVyIGxldHRlcjoKCiAgLSBOaWNrIERlc2F1bG5p ZXJzLCBKb2UgUGVyY2hlcywgTWFzYWhpcm8gWWFtYWRhIGFuZCBKYXJra28gU2Fra2luZW4KICAg IGZvciB0aGVpciByZXZpZXdzIG9mIHNvbWUgb2YgdGhlIHY3IHBhdGNoZXMuCgogIC0gRGFuaWVs IExhdHlwb3YsIEJyZW5kYW4gSGlnZ2lucyBhbmQgU2h1YWggS2hhbiBmb3IgcGlja2luZyB1cAog ICAgdGhlIEtVbml0IHByZXJlcXVpc2l0ZSBwYXRjaC4KCiAgLSBBcyB1c3VhbCwgQmrDtnJuIFJv eSBCYXJvbiAoYmpvcm4zKSBhbmQgR2FyeSBHdW8gZm9yIGFsbCB0aGUgaW5wdXQKICAgIG9uIFJ1 c3QgY29tcGlsZXIgZGV0YWlscywgcmV2aWV3cyBhbmQgc3VnZ2VzdGlvbnMuCgogIC0gQW5kcmVh cyBIaW5kYm9yZyBmb3Igd29ya2luZyBvbiB0aGUgTlZNZSBkcml2ZXIsIGFzIHdlbGwgYXMKICAg IGFkZGluZyBhdG9taWMgYWxsb2NhdGlvbnMgZm9yIGBCb3hgIGFuZCBhbGxvd2luZyB0byB1c2Ug R0ZQIGZsYWdzCiAgICBmb3IgYEtlcm5lbEFsbG9jYXRvcmAuCgogIC0gTGkgSG9uZ3l1IGZvciB3 b3JraW5nIG9uIGEgdmlydGlvIGFic3RyYWN0aW9uLgoKICAtIEJvcXVuIEZlbmcgZm9yIHdvcmtp bmcgb24gYWRkaW5nIGFuIGFsbG9jIGFsaWdubWVudCB0ZXN0LgoKICAtIEFuZHJlYXMgUmVpbmRs IGZvciB3b3JraW5nIG9uIGFkZGluZyBtaXNzaW5nIGBTQUZFVFlgIGNvbW1lbnRzLgoKICAtIEFu aGFkIFNpbmdoIGZvciB3b3JraW5nIG9uIGFkZGluZyB0aGUgYG5ld193aXRoX2ZsYWdzYCBtZXRo b2QKICAgIHRvIGBQYWdlc2AuCgogIC0gRmlubiBCZWhyZW5zIGZvciB3b3JraW5nIG9uIG1ha2lu ZyBpdCBwb3NzaWJsZSB0byBjb21waWxlCiAgICB0aGUga2VybmVsIG9uIG1hY09TIHdpdGggUnVz dCBlbmFibGVkLgoKICAtIFJvZWwgS2x1aW4gZm9yIHdvcmtpbmcgb24gY29kZSByZWZhY3Rvcmlu Z3MuCgogIC0gV2VpIExpdSBmb3IgdGFraW5nIHRoZSB0aW1lIHRvIGFuc3dlciBxdWVzdGlvbnMg ZnJvbSBuZXdjb21lcnMKICAgIGluIFp1bGlwLgoKICAtIFBoaWxpcCBMaSwgWXVqaWUgTGl1IGV0 IGFsLiBmb3IgY29udGludWluZyB0aGVpciB3b3JrIG9uIGFkZGluZwogICAgUnVzdCBzdXBwb3J0 IHRvIHRoZSBJbnRlbCAwREFZL0xLUCBrZXJuZWwgdGVzdCByb2JvdC4KCiAgLSBQaGlsaXAgSGVy cm9uIGFuZCBBcnRodXIgQ29oZW4gKGFuZCBoaXMgc3VwcG9ydGVycyBPcGVuIFNvdXJjZQogICAg U2VjdXJpdHkgYW5kIEVtYmVjb3NtKSBldCBhbC4gZm9yIHRoZWlyIG9uZ29pbmcgd29yayBvbiBH Q0MgUnVzdC4KCiAgLSBBbnRvbmkgQm91Y2hlciAoYW5kIGhpcyBzdXBwb3J0ZXJzKSBldCBhbC4g Zm9yIHRoZWlyIG9uZ29pbmcKICAgIHdvcmsgb24gYHJ1c3RjX2NvZGVnZW5fZ2NjYC4KCiAgLSBF bWlsaW8gQ29ib3Mgw4FsdmFyZXogZXQuIGFsLiBmb3IgdGhlaXIgd29yayBvbiBgYmluZGdlbmAs CiAgICBpbmNsdWRpbmcgb24gaXNzdWVzIHRoYXQgYWZmZWN0IHRoZSBrZXJuZWwuCgogIC0gTWF0 cyBMYXJzZW4sIE1hcmMgUG91bGhpw6hzIGV0IGFsLiBmb3IgdGhlaXIgb25nb2luZyB3b3JrIG9u CiAgICBpbXByb3ZpbmcgUnVzdCBzdXBwb3J0IGluIENvbXBpbGVyIEV4cGxvcmVyLgoKICAtIE1h bnkgZm9sa3MgdGhhdCBoYXZlIHJlcG9ydGVkIGlzc3VlcywgdGVzdGVkIHRoZSBwcm9qZWN0LAog ICAgaGVscGVkIHNwcmVhZCB0aGUgd29yZCwgam9pbmVkIGRpc2N1c3Npb25zIGFuZCBjb250cmli dXRlZCBpbgogICAgb3RoZXIgd2F5cyEKClBsZWFzZSBzZWUgYWxzbyB0aGUgYWNrbm93bGVkZ2Vt ZW50cyBvbiB0aGUgcHJldmlvdXMgY292ZXIgbGV0dGVycy4KCgpCb3F1biBGZW5nICgyKToKICBr YWxsc3ltczogdXNlIGBzaXplb2ZgIGluc3RlYWQgb2YgaGFyZGNvZGVkIHNpemUKICBrYWxsc3lt czogYXZvaWQgaGFyZGNvZGluZyBidWZmZXIgc2l6ZQoKR2FyeSBHdW8gKDIpOgogIHJ1c3Q6IGFk ZCBgYnVpbGRfZXJyb3JgIGNyYXRlCiAgdnNwcmludGY6IGFkZCBuZXcgYCVwQWAgZm9ybWF0IHNw ZWNpZmllcgoKTWlndWVsIE9qZWRhICgxOSk6CiAga2FsbHN5bXM6IGFkZCBzdGF0aWMgcmVsYXRp b25zaGlwIGJldHdlZW4gYEtTWU1fTkFNRV9MRU57LF9CVUZGRVJ9YAogIGthbGxzeW1zOiBzdXBw b3J0ICJiaWciIGtlcm5lbCBzeW1ib2xzCiAga2FsbHN5bXM6IGluY3JlYXNlIG1heGltdW0ga2Vy bmVsIHN5bWJvbCBsZW5ndGggdG8gNTEyCiAgcnVzdDogYWRkIEMgaGVscGVycwogIHJ1c3Q6IGFk ZCBgY29tcGlsZXJfYnVpbHRpbnNgIGNyYXRlCiAgcnVzdDogaW1wb3J0IHVwc3RyZWFtIGBhbGxv Y2AgY3JhdGUKICBydXN0OiBhZGFwdCBgYWxsb2NgIGNyYXRlIHRvIHRoZSBrZXJuZWwKICBydXN0 OiBhZGQgYG1hY3Jvc2AgY3JhdGUKICBydXN0OiBhZGQgYGJpbmRpbmdzYCBjcmF0ZQogIHJ1c3Q6 IGV4cG9ydCBnZW5lcmF0ZWQgc3ltYm9scwogIHNjcmlwdHM6IGNoZWNrcGF0Y2g6IGRpYWdub3Nl IHVzZXMgb2YgYCVwQWAgaW4gdGhlIEMgc2lkZSBhcyBlcnJvcnMKICBzY3JpcHRzOiBjaGVja3Bh dGNoOiBlbmFibGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgY2hlY2tzIGZvciBSdXN0CiAgc2NyaXB0 czogYWRkIGBydXN0ZG9jX3Rlc3Rfe2J1aWxkZXIsZ2VufS5weWAgc2NyaXB0cwogIHNjcmlwdHM6 IGFkZCBgZ2VuZXJhdGVfcnVzdF9hbmFseXplci5weWAgc2NyaXB0cwogIHNjcmlwdHM6IGRlY29k ZV9zdGFja3RyYWNlOiBkZW1hbmdsZSBSdXN0IHN5bWJvbHMKICBkb2NzOiBhZGQgUnVzdCBkb2N1 bWVudGF0aW9uCiAgS2J1aWxkOiBhZGQgUnVzdCBzdXBwb3J0CiAgc2FtcGxlczogYWRkIFJ1c3Qg ZXhhbXBsZXMKICBNQUlOVEFJTkVSUzogUnVzdAoKV2Vkc29uIEFsbWVpZGEgRmlsaG8gKDgpOgog IHdvcmtxdWV1ZTogaW50cm9kdWNlIGBfX0lOSVRfV09SS19XSVRIX0tFWWAKICBsb2NraW5nL3Nw aW5sb2NrOiBpbnRyb2R1Y2UgYF9fc3Bpbl9sb2NrX2luaXRgCiAgbG9ja2luZy9zcGlubG9jazog aW50cm9kdWNlIGBfcmF3X3NwaW5fbG9ja19pbml0YAogIHJ1c3Q6IGFkZCBga2VybmVsYCBjcmF0 ZSdzIGBzeW5jYCBtb2R1bGUKICBydXN0OiBhZGQgYGtlcm5lbGAgY3JhdGUKICBjb25maWdzOiBh ZGQgYHJ1c3RgIGNvbmZpZwogIFtSRkNdIGRyaXZlcnM6IGdwaW86IFByaW1lQ2VsbCBQTDA2MSBp biBSdXN0CiAgW1JGQ10gZHJpdmVyczogYW5kcm9pZDogQmluZGVyIElQQyBpbiBSdXN0CgogLmdp dGlnbm9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsKIC5ydXN0 Zm10LnRvbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMiArCiBEb2N1bWVu dGF0aW9uL2NvcmUtYXBpL3ByaW50ay1mb3JtYXRzLnJzdCAgICB8ICAgMTAgKwogRG9jdW1lbnRh dGlvbi9kb2MtZ3VpZGUva2VybmVsLWRvYy5yc3QgICAgICAgfCAgICAzICsKIERvY3VtZW50YXRp b24vaW5kZXgucnN0ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBEb2N1bWVudGF0aW9u L2tidWlsZC9rYnVpbGQucnN0ICAgICAgICAgICAgICB8ICAgMTcgKwogRG9jdW1lbnRhdGlvbi9r YnVpbGQvbWFrZWZpbGVzLnJzdCAgICAgICAgICAgfCAgIDUwICstCiBEb2N1bWVudGF0aW9uL3By b2Nlc3MvY2hhbmdlcy5yc3QgICAgICAgICAgICB8ICAgNDEgKwogRG9jdW1lbnRhdGlvbi9ydXN0 L2FyY2gtc3VwcG9ydC5yc3QgICAgICAgICAgfCAgIDIzICsKIERvY3VtZW50YXRpb24vcnVzdC9j b2RpbmctZ3VpZGVsaW5lcy5yc3QgICAgIHwgIDIxNiArKwogRG9jdW1lbnRhdGlvbi9ydXN0L2dl bmVyYWwtaW5mb3JtYXRpb24ucnN0ICAgfCAgIDc5ICsKIERvY3VtZW50YXRpb24vcnVzdC9pbmRl eC5yc3QgICAgICAgICAgICAgICAgIHwgICAyMiArCiBEb2N1bWVudGF0aW9uL3J1c3QvcXVpY2st c3RhcnQucnN0ICAgICAgICAgICB8ICAyMzIgKysKIE1BSU5UQUlORVJTICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNSArCiBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAxNzIgKy0KIGFyY2gvS2NvbmZpZyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNiArCiBhcmNoL2FybS9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgKwogYXJjaC9hcm02NC9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAxICsKIGFyY2gvcG93ZXJwYy9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgMSArCiBhcmNoL3Jpc2N2L0tjb25maWcgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgIDEgKwogYXJjaC9yaXNjdi9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICA1ICsKIGFyY2gvdW0vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMSArCiBhcmNoL3g4Ni9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgIDEgKwogYXJjaC94ODYvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEwICsKIGRyaXZlcnMvYW5kcm9pZC9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNiArCiBkcml2ZXJzL2FuZHJvaWQvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICB8ICAg IDIgKwogZHJpdmVycy9hbmRyb2lkL2FsbG9jYXRpb24ucnMgICAgICAgICAgICAgICAgfCAgMjY2 ICsrCiBkcml2ZXJzL2FuZHJvaWQvY29udGV4dC5ycyAgICAgICAgICAgICAgICAgICB8ICAgODAg KwogZHJpdmVycy9hbmRyb2lkL2RlZnMucnMgICAgICAgICAgICAgICAgICAgICAgfCAgIDk5ICsK IGRyaXZlcnMvYW5kcm9pZC9ub2RlLnJzICAgICAgICAgICAgICAgICAgICAgIHwgIDQ3NiArKysK IGRyaXZlcnMvYW5kcm9pZC9wcm9jZXNzLnJzICAgICAgICAgICAgICAgICAgIHwgIDk2MSArKysr KwogZHJpdmVycy9hbmRyb2lkL3JhbmdlX2FsbG9jLnJzICAgICAgICAgICAgICAgfCAgMTg5ICsK IGRyaXZlcnMvYW5kcm9pZC9ydXN0X2JpbmRlci5ycyAgICAgICAgICAgICAgIHwgIDEwNiArCiBk cml2ZXJzL2FuZHJvaWQvdGhyZWFkLnJzICAgICAgICAgICAgICAgICAgICB8ICA4NzEgKysrKysK IGRyaXZlcnMvYW5kcm9pZC90cmFuc2FjdGlvbi5ycyAgICAgICAgICAgICAgIHwgIDMyNiArKwog ZHJpdmVycy9ncGlvL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4ICsKIGRy aXZlcnMvZ3Bpby9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBkcml2 ZXJzL2dwaW8vZ3Bpb19wbDA2MV9ydXN0LnJzICAgICAgICAgICAgICB8ICAzNjcgKysKIGluY2x1 ZGUvbGludXgvY29tcGlsZXJfdHlwZXMuaCAgICAgICAgICAgICAgIHwgICAgNiArLQogaW5jbHVk ZS9saW51eC9rYWxsc3ltcy5oICAgICAgICAgICAgICAgICAgICAgfCAgICAyICstCiBpbmNsdWRl L2xpbnV4L3NwaW5sb2NrLmggICAgICAgICAgICAgICAgICAgICB8ICAgMTcgKy0KIGluY2x1ZGUv bGludXgvd29ya3F1ZXVlLmggICAgICAgICAgICAgICAgICAgIHwgICAyMSArLQogaW5jbHVkZS91 YXBpL2xpbnV4L2FuZHJvaWQvYmluZGVyLmggICAgICAgICAgfCAgIDMwICstCiBpbml0L0tjb25m aWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDYgKy0KIGtlcm5lbC9jb25m aWdzL3J1c3QuY29uZmlnICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBrZXJuZWwva2FsbHN5 bXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjYgKy0KIGtlcm5lbC9saXZlcGF0 Y2gvY29yZS5jICAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArLQogbGliL0tjb25maWcuZGVi dWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDgyICsKIGxpYi92c3ByaW50Zi5jICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMyArCiBydXN0Ly5naXRpZ25vcmUgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTAgKwogcnVzdC9NYWtlZmlsZSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDE1ICsrKwogcnVzdC9hbGxvYy9SRUFETUUubWQg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMzICsKIHJ1c3QvYWxsb2MvYWxsb2MucnMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDQ0MCArKysKIHJ1c3QvYWxsb2MvYm9ycm93LnJzICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDQ5OCArKysKIHJ1c3QvYWxsb2MvYm94ZWQucnMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMjAyNiArKysrKysrKysrKwogcnVzdC9hbGxvYy9ib3hl ZC90aGluLnJzICAgICAgICAgICAgICAgICAgICAgfCAgMjE5ICsrCiBydXN0L2FsbG9jL2NvbGxl Y3Rpb25zL21vZC5ycyAgICAgICAgICAgICAgICB8ICAxNTYgKwogcnVzdC9hbGxvYy9mZmkvY19z dHIucnMgICAgICAgICAgICAgICAgICAgICAgfCAxMjAzICsrKysrKwogcnVzdC9hbGxvYy9mZmkv bW9kLnJzICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDkzICsKIHJ1c3QvYWxsb2MvZm10LnJz ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYxNCArKysrCiBydXN0L2FsbG9jL2xpYi5y cyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyMzkgKysKIHJ1c3QvYWxsb2MvbWFjcm9z LnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyOCArCiBydXN0L2FsbG9jL3Jhd192ZWMu cnMgICAgICAgICAgICAgICAgICAgICAgICB8ICA1NjcgKysrCiBydXN0L2FsbG9jL3NsaWNlLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyOTUgKysrKysrKwogcnVzdC9hbGxvYy9zdHIu cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQxICsrKysKIHJ1c3QvYWxsb2Mvc3Ry aW5nLnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjk0NCArKysrKysrKysrKysrKysKIHJ1 c3QvYWxsb2MvdmVjL2RyYWluLnJzICAgICAgICAgICAgICAgICAgICAgIHwgIDE4NiArCiBydXN0 L2FsbG9jL3ZlYy9kcmFpbl9maWx0ZXIucnMgICAgICAgICAgICAgICB8ICAxNDUgKwogcnVzdC9h bGxvYy92ZWMvaW50b19pdGVyLnJzICAgICAgICAgICAgICAgICAgfCAgMzY1ICsrCiBydXN0L2Fs bG9jL3ZlYy9pc196ZXJvLnJzICAgICAgICAgICAgICAgICAgICB8ICAxMjAgKwogcnVzdC9hbGxv Yy92ZWMvbW9kLnJzICAgICAgICAgICAgICAgICAgICAgICAgfCAzNDIwICsrKysrKysrKysrKysr KysrKwogcnVzdC9hbGxvYy92ZWMvcGFydGlhbF9lcS5ycyAgICAgICAgICAgICAgICAgfCAgIDQ5 ICsKIHJ1c3QvYWxsb2MvdmVjL3NldF9sZW5fb25fZHJvcC5ycyAgICAgICAgICAgIHwgICAzMCAr CiBydXN0L2FsbG9jL3ZlYy9zcGVjX2V4dGVuZC5ycyAgICAgICAgICAgICAgICB8ICAxNzQgKwog cnVzdC9iaW5kZ2VuX3BhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxICsKIHJ1 c3QvYmluZGluZ3MvYmluZGluZ3NfaGVscGVyLmggICAgICAgICAgICAgIHwgICA0OSArCiBydXN0 L2JpbmRpbmdzL2xpYi5ycyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTcgKwogcnVzdC9i dWlsZF9lcnJvci5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI5ICsKIHJ1c3QvY29t cGlsZXJfYnVpbHRpbnMucnMgICAgICAgICAgICAgICAgICAgIHwgICA3OSArCiBydXN0L2V4cG9y dHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjEgKwogcnVzdC9oZWxwZXJz LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjc5ICsrKysKIHJ1c3Qva2VybmVs L2FsbG9jYXRvci5ycyAgICAgICAgICAgICAgICAgICAgIHwgICA2NCArCiBydXN0L2tlcm5lbC9h bWJhLnJzICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyNjEgKysKIHJ1c3Qva2VybmVsL2J1 aWxkX2Fzc2VydC5ycyAgICAgICAgICAgICAgICAgIHwgICA4MyArCiBydXN0L2tlcm5lbC9jaHJk ZXYucnMgICAgICAgICAgICAgICAgICAgICAgICB8ICAyMDYgKysKIHJ1c3Qva2VybmVsL2Nsay5y cyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3OSArCiBydXN0L2tlcm5lbC9jcmVkLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDYgKwogcnVzdC9rZXJuZWwvZGVsYXkucnMg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTA0ICsKIHJ1c3Qva2VybmVsL2RldmljZS5ycyAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDUyNyArKysKIHJ1c3Qva2VybmVsL2RyaXZlci5ycyAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDQ0MiArKysKIHJ1c3Qva2VybmVsL2Vycm9yLnJzICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDU2NCArKysKIHJ1c3Qva2VybmVsL2ZpbGUucnMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDg4NyArKysrKwogcnVzdC9rZXJuZWwvZnMucnMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ2ICsrKysrCiBydXN0L2tlcm5lbC9mcy9wYXJh bS5ycyAgICAgICAgICAgICAgICAgICAgICB8ICA1NTMgKysrCiBydXN0L2tlcm5lbC9ncGlvLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MDUgKysrCiBydXN0L2tlcm5lbC9od3JuZy5y cyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyMTAgKysKIHJ1c3Qva2VybmVsL2lvX2J1ZmZl ci5ycyAgICAgICAgICAgICAgICAgICAgIHwgIDE1MyArCiBydXN0L2tlcm5lbC9pb19tZW0ucnMg ICAgICAgICAgICAgICAgICAgICAgICB8ICAyNzggKysKIHJ1c3Qva2VybmVsL2lvdl9pdGVyLnJz ICAgICAgICAgICAgICAgICAgICAgIHwgICA4MSArCiBydXN0L2tlcm5lbC9pcnEucnMgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICA2ODEgKysrKwogcnVzdC9rZXJuZWwva2FzeW5jLnJzICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDUwICsKIHJ1c3Qva2VybmVsL2thc3luYy9leGVjdXRv ci5ycyAgICAgICAgICAgICAgIHwgIDE1NCArCiBydXN0L2tlcm5lbC9rYXN5bmMvZXhlY3V0b3Iv d29ya3F1ZXVlLnJzICAgICB8ICAyOTEgKysKIHJ1c3Qva2VybmVsL2thc3luYy9uZXQucnMgICAg ICAgICAgICAgICAgICAgIHwgIDMyMiArKwogcnVzdC9rZXJuZWwva3VuaXQucnMgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDkxICsKIHJ1c3Qva2VybmVsL2xpYi5ycyAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgIDI2NyArKwogcnVzdC9rZXJuZWwvbGlua2VkX2xpc3QucnMgICAgICAg ICAgICAgICAgICAgfCAgMjQ3ICsrCiBydXN0L2tlcm5lbC9taXNjZGV2LnJzICAgICAgICAgICAg ICAgICAgICAgICB8ICAyOTAgKysKIHJ1c3Qva2VybmVsL21tLnJzICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDE0OSArCiBydXN0L2tlcm5lbC9tb2R1bGVfcGFyYW0ucnMgICAgICAgICAg ICAgICAgICB8ICA0OTkgKysrCiBydXN0L2tlcm5lbC9uZXQucnMgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAzOTIgKysKIHJ1c3Qva2VybmVsL25ldC9maWx0ZXIucnMgICAgICAgICAgICAg ICAgICAgIHwgIDQ0NyArKysKIHJ1c3Qva2VybmVsL29mLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA2MyArCiBydXN0L2tlcm5lbC9wYWdlcy5ycyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAxNDQgKwogcnVzdC9rZXJuZWwvcGxhdGZvcm0ucnMgICAgICAgICAgICAgICAgICAg ICAgfCAgMjIzICsrCiBydXN0L2tlcm5lbC9wb3dlci5ycyAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAxMTggKwogcnVzdC9rZXJuZWwvcHJlbHVkZS5ycyAgICAgICAgICAgICAgICAgICAgICAg fCAgIDM2ICsKIHJ1c3Qva2VybmVsL3ByaW50LnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwg IDQwNiArKysKIHJ1c3Qva2VybmVsL3JhbmRvbS5ycyAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0MiArCiBydXN0L2tlcm5lbC9yYXdfbGlzdC5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAz NjEgKysKIHJ1c3Qva2VybmVsL3JidHJlZS5ycyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDU2 MyArKysKIHJ1c3Qva2VybmVsL3Jldm9jYWJsZS5ycyAgICAgICAgICAgICAgICAgICAgIHwgIDQy NSArKysKIHJ1c3Qva2VybmVsL3NlY3VyaXR5LnJzICAgICAgICAgICAgICAgICAgICAgIHwgICAz OCArCiBydXN0L2tlcm5lbC9zdGF0aWNfYXNzZXJ0LnJzICAgICAgICAgICAgICAgICB8ICAgMzQg KwogcnVzdC9rZXJuZWwvc3RkX3ZlbmRvci5ycyAgICAgICAgICAgICAgICAgICAgfCAgMTYxICsK IHJ1c3Qva2VybmVsL3N0ci5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDU5NyArKysK IHJ1c3Qva2VybmVsL3N5bmMucnMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE2OSArCiBy dXN0L2tlcm5lbC9zeW5jL2FyYy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICA1ODIgKysrCiBy dXN0L2tlcm5lbC9zeW5jL2NvbmR2YXIucnMgICAgICAgICAgICAgICAgICB8ICAxNDAgKwogcnVz dC9rZXJuZWwvc3luYy9ndWFyZC5ycyAgICAgICAgICAgICAgICAgICAgfCAgMTU5ICsKIHJ1c3Qv a2VybmVsL3N5bmMvbG9ja2VkX2J5LnJzICAgICAgICAgICAgICAgIHwgIDExMSArCiBydXN0L2tl cm5lbC9zeW5jL211dGV4LnJzICAgICAgICAgICAgICAgICAgICB8ICAxNDkgKwogcnVzdC9rZXJu ZWwvc3luYy9ub3dhaXQucnMgICAgICAgICAgICAgICAgICAgfCAgMTg4ICsKIHJ1c3Qva2VybmVs L3N5bmMvcmN1LnJzICAgICAgICAgICAgICAgICAgICAgIHwgICA1MiArCiBydXN0L2tlcm5lbC9z eW5jL3Jldm9jYWJsZS5ycyAgICAgICAgICAgICAgICB8ICAyNDYgKysKIHJ1c3Qva2VybmVsL3N5 bmMvcndzZW0ucnMgICAgICAgICAgICAgICAgICAgIHwgIDE5NiArCiBydXN0L2tlcm5lbC9zeW5j L3NlcWxvY2sucnMgICAgICAgICAgICAgICAgICB8ICAyMDEgKwogcnVzdC9rZXJuZWwvc3luYy9z bXV0ZXgucnMgICAgICAgICAgICAgICAgICAgfCAgMjkwICsrCiBydXN0L2tlcm5lbC9zeW5jL3Nw aW5sb2NrLnJzICAgICAgICAgICAgICAgICB8ICAzNTcgKysKIHJ1c3Qva2VybmVsL3N5c2N0bC5y cyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE5OSArCiBydXN0L2tlcm5lbC90YXNrLnJzICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAyMzkgKysKIHJ1c3Qva2VybmVsL3R5cGVzLnJzICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDcwNSArKysrCiBydXN0L2tlcm5lbC91bnNhZmVfbGlz dC5ycyAgICAgICAgICAgICAgICAgICB8ICA2ODAgKysrKwogcnVzdC9rZXJuZWwvdXNlcl9wdHIu cnMgICAgICAgICAgICAgICAgICAgICAgfCAgMTc1ICsKIHJ1c3Qva2VybmVsL3dvcmtxdWV1ZS5y cyAgICAgICAgICAgICAgICAgICAgIHwgIDUxMiArKysKIHJ1c3QvbWFjcm9zL2NvbmNhdF9pZGVu dHMucnMgICAgICAgICAgICAgICAgIHwgICAyMyArCiBydXN0L21hY3Jvcy9oZWxwZXJzLnJzICAg ICAgICAgICAgICAgICAgICAgICB8ICAgNzkgKwogcnVzdC9tYWNyb3MvbGliLnJzICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgMTkxICsKIHJ1c3QvbWFjcm9zL21vZHVsZS5ycyAgICAgICAg ICAgICAgICAgICAgICAgIHwgIDY1NSArKysrCiBydXN0L21hY3Jvcy92dGFibGUucnMgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgOTUgKwogc2FtcGxlcy9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAyICsKIHNhbXBsZXMvTWFrZWZpbGUgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMSArCiBzYW1wbGVzL3J1c3QvS2NvbmZpZyAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAxNjUgKwogc2FtcGxlcy9ydXN0L01ha2VmaWxlICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDE5ICsKIHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvLmdpdGlnbm9yZSAgICAg ICAgICAgIHwgICAgMyArCiBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL01ha2VmaWxlICAgICAgICAg ICAgICB8ICAgIDUgKwogc2FtcGxlcy9ydXN0L2hvc3Rwcm9ncy9hLnJzICAgICAgICAgICAgICAg ICAgfCAgICA3ICsKIHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvYi5ycyAgICAgICAgICAgICAgICAg IHwgICAgNSArCiBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL3NpbmdsZS5ycyAgICAgICAgICAgICB8 ICAgMTIgKwogc2FtcGxlcy9ydXN0L3J1c3RfY2hyZGV2LnJzICAgICAgICAgICAgICAgICAgfCAg IDQ5ICsKIHNhbXBsZXMvcnVzdC9ydXN0X2VjaG9fc2VydmVyLnJzICAgICAgICAgICAgIHwgICA2 MCArCiBzYW1wbGVzL3J1c3QvcnVzdF9mcy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAgNTkg Kwogc2FtcGxlcy9ydXN0L3J1c3RfbWluaW1hbC5ycyAgICAgICAgICAgICAgICAgfCAgIDM1ICsK IHNhbXBsZXMvcnVzdC9ydXN0X21pc2NkZXYucnMgICAgICAgICAgICAgICAgIHwgIDE0MiArCiBz YW1wbGVzL3J1c3QvcnVzdF9tb2R1bGVfcGFyYW1ldGVycy5ycyAgICAgICB8ICAgNjkgKwogc2Ft cGxlcy9ydXN0L3J1c3RfbmV0ZmlsdGVyLnJzICAgICAgICAgICAgICAgfCAgIDU0ICsKIHNhbXBs ZXMvcnVzdC9ydXN0X3BsYXRmb3JtLnJzICAgICAgICAgICAgICAgIHwgICAyMiArCiBzYW1wbGVz L3J1c3QvcnVzdF9wcmludC5ycyAgICAgICAgICAgICAgICAgICB8ICAgNTQgKwogc2FtcGxlcy9y dXN0L3J1c3RfcmFuZG9tLnJzICAgICAgICAgICAgICAgICAgfCAgIDYwICsKIHNhbXBsZXMvcnVz dC9ydXN0X3NlbGZ0ZXN0cy5ycyAgICAgICAgICAgICAgIHwgICA5OSArCiBzYW1wbGVzL3J1c3Qv cnVzdF9zZW1hcGhvcmUucnMgICAgICAgICAgICAgICB8ICAxNzAgKwogc2FtcGxlcy9ydXN0L3J1 c3Rfc2VtYXBob3JlX2MuYyAgICAgICAgICAgICAgfCAgMjEyICsrCiBzYW1wbGVzL3J1c3QvcnVz dF9zdGFja19wcm9iaW5nLnJzICAgICAgICAgICB8ICAgMzYgKwogc2FtcGxlcy9ydXN0L3J1c3Rf c3luYy5ycyAgICAgICAgICAgICAgICAgICAgfCAgIDkzICsKIHNjcmlwdHMvLmdpdGlnbm9yZSAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBzY3JpcHRzL0tjb25maWcuaW5jbHVk ZSAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKy0KIHNjcmlwdHMvTWFrZWZpbGUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMyArCiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkICAg ICAgICAgICAgICAgICAgICAgICB8ICAgNjAgKwogc2NyaXB0cy9NYWtlZmlsZS5kZWJ1ZyAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDEwICsKIHNjcmlwdHMvTWFrZWZpbGUuaG9zdCAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAzNCArLQogc2NyaXB0cy9NYWtlZmlsZS5saWIgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDEyICsKIHNjcmlwdHMvTWFrZWZpbGUubW9kZmluYWwgICAgICAg ICAgICAgICAgICAgIHwgICAgOCArLQogc2NyaXB0cy9jYy12ZXJzaW9uLnNoICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDEyICstCiBzY3JpcHRzL2NoZWNrcGF0Y2gucGwgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMTIgKy0KIHNjcmlwdHMvZGVjb2RlX3N0YWNrdHJhY2Uuc2ggICAgICAg ICAgICAgICAgIHwgICAxNCArCiBzY3JpcHRzL2dlbmVyYXRlX3J1c3RfYW5hbHl6ZXIucHkgICAg ICAgICAgICB8ICAxNDEgKwogc2NyaXB0cy9nZW5lcmF0ZV9ydXN0X3RhcmdldC5ycyAgICAgICAg ICAgICAgfCAgMjMyICsrCiBzY3JpcHRzL2lzX3J1c3RfbW9kdWxlLnNoICAgICAgICAgICAgICAg ICAgICB8ICAgMTYgKwogc2NyaXB0cy9rYWxsc3ltcy5jICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDQ3ICstCiBzY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyAgICAgICAgICAgICAgICAg ICB8ICAgNzUgKwogc2NyaXB0cy9taW4tdG9vbC12ZXJzaW9uLnNoICAgICAgICAgICAgICAgICAg fCAgICA2ICsKIHNjcmlwdHMvcnVzdC1pcy1hdmFpbGFibGUtYmluZGdlbi1saWJjbGFuZy5oIHwg ICAgMiArCiBzY3JpcHRzL3J1c3QtaXMtYXZhaWxhYmxlLnNoICAgICAgICAgICAgICAgICB8ICAx NjAgKwogc2NyaXB0cy9ydXN0ZG9jX3Rlc3RfYnVpbGRlci5weSAgICAgICAgICAgICAgfCAgIDU5 ICsKIHNjcmlwdHMvcnVzdGRvY190ZXN0X2dlbi5weSAgICAgICAgICAgICAgICAgIHwgIDE2NCAr CiB0b29scy9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmggICAgICAgICAgICAgICB8ICAgIDIgKy0K IHRvb2xzL2xpYi9wZXJmL2luY2x1ZGUvcGVyZi9ldmVudC5oICAgICAgICAgIHwgICAgMiArLQog dG9vbHMvbGliL3N5bWJvbC9rYWxsc3ltcy5oICAgICAgICAgICAgICAgICAgfCAgICAyICstCiAx OTggZmlsZXMgY2hhbmdlZCwgNDM2ODggaW5zZXJ0aW9ucygrKSwgNzUgZGVsZXRpb25zKC0pCiBj cmVhdGUgbW9kZSAxMDA2NDQgLnJ1c3RmbXQudG9tbAogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3Vt ZW50YXRpb24vcnVzdC9hcmNoLXN1cHBvcnQucnN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1l bnRhdGlvbi9ydXN0L2NvZGluZy1ndWlkZWxpbmVzLnJzdAogY3JlYXRlIG1vZGUgMTAwNjQ0IERv Y3VtZW50YXRpb24vcnVzdC9nZW5lcmFsLWluZm9ybWF0aW9uLnJzdAogY3JlYXRlIG1vZGUgMTAw NjQ0IERvY3VtZW50YXRpb24vcnVzdC9pbmRleC5yc3QKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1 bWVudGF0aW9uL3J1c3QvcXVpY2stc3RhcnQucnN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9hbmRyb2lkL2FsbG9jYXRpb24ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJv aWQvY29udGV4dC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5kcm9pZC9kZWZzLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9hbmRyb2lkL25vZGUucnMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvcHJvY2Vzcy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvYW5kcm9pZC9yYW5nZV9hbGxvYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv YW5kcm9pZC9ydXN0X2JpbmRlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5kcm9p ZC90aHJlYWQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvdHJhbnNhY3Rp b24ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwaW8vZ3Bpb19wbDA2MV9ydXN0LnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQga2VybmVsL2NvbmZpZ3MvcnVzdC5jb25maWcKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0Ly5naXRpZ25vcmUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L01ha2Vm aWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy9SRUFETUUubWQKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBydXN0L2FsbG9jL2FsbG9jLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxv Yy9ib3Jyb3cucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL2JveGVkLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy9ib3hlZC90aGluLnJzCiBjcmVhdGUgbW9kZSAxMDA2 NDQgcnVzdC9hbGxvYy9jb2xsZWN0aW9ucy9tb2QucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2FsbG9jL2ZmaS9jX3N0ci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvZmZpL21v ZC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvZm10LnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9hbGxvYy9saWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL21h Y3Jvcy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvcmF3X3ZlYy5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mvc2xpY2UucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2FsbG9jL3N0ci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mvc3RyaW5nLnJzCiBj cmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvZHJhaW4ucnMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBydXN0L2FsbG9jL3ZlYy9kcmFpbl9maWx0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2FsbG9jL3ZlYy9pbnRvX2l0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9j L3ZlYy9pc196ZXJvLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvbW9kLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvcGFydGlhbF9lcS5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvdmVjL3NldF9sZW5fb25fZHJvcC5ycwogY3JlYXRlIG1v ZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvdmVjL3NwZWNfZXh0ZW5kLnJzCiBjcmVhdGUgbW9kZSAxMDA2 NDQgcnVzdC9iaW5kZ2VuX3BhcmFtZXRlcnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2JpbmRp bmdzL2JpbmRpbmdzX2hlbHBlci5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9iaW5kaW5ncy9s aWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2J1aWxkX2Vycm9yLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9jb21waWxlcl9idWlsdGlucy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3QvZXhwb3J0cy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9oZWxwZXJzLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9hbGxvY2F0b3IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9hbWJhLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvYnVpbGRf YXNzZXJ0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvY2hyZGV2LnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvY2xrLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9rZXJuZWwvY3JlZC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2RlbGF5LnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvZGV2aWNlLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvZHJpdmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJu ZWwvZXJyb3IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9maWxlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvZnMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2tlcm5lbC9mcy9wYXJhbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2dwaW8u cnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9od3JuZy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3Qva2VybmVsL2lvX2J1ZmZlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qv a2VybmVsL2lvX21lbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2lvdl9pdGVy LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvaXJxLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwva2FzeW5jLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJu ZWwva2FzeW5jL2V4ZWN1dG9yLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwva2Fz eW5jL2V4ZWN1dG9yL3dvcmtxdWV1ZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVs L2thc3luYy9uZXQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9rdW5pdC5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2xpYi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0 IHJ1c3Qva2VybmVsL2xpbmtlZF9saXN0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJu ZWwvbWlzY2Rldi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL21tLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvbW9kdWxlX3BhcmFtLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvbmV0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwv bmV0L2ZpbHRlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL29mLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcGFnZXMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9wbGF0Zm9ybS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3Bv d2VyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcHJlbHVkZS5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3ByaW50LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9rZXJuZWwvcmFuZG9tLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcmF3X2xp c3QucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9yYnRyZWUucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9yZXZvY2FibGUucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9zZWN1cml0eS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N0 YXRpY19hc3NlcnQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zdGRfdmVuZG9y LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3RyLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvc3luYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVs L3N5bmMvYXJjLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3luYy9jb25kdmFy LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3luYy9ndWFyZC5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvbG9ja2VkX2J5LnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvc3luYy9tdXRleC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qv a2VybmVsL3N5bmMvbm93YWl0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3lu Yy9yY3UucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL3Jldm9jYWJsZS5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvcndzZW0ucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL3NlcWxvY2sucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydXN0L2tlcm5lbC9zeW5jL3NtdXRleC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2Vy bmVsL3N5bmMvc3BpbmxvY2sucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeXNj dGwucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC90YXNrLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9rZXJuZWwvdHlwZXMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tl cm5lbC91bnNhZmVfbGlzdC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3VzZXJf cHRyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvd29ya3F1ZXVlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9tYWNyb3MvY29uY2F0X2lkZW50cy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3QvbWFjcm9zL2hlbHBlcnMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L21h Y3Jvcy9saWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L21hY3Jvcy9tb2R1bGUucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBydXN0L21hY3Jvcy92dGFibGUucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzYW1wbGVzL3J1c3QvS2NvbmZpZwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9N YWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvLmdpdGln bm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvTWFrZWZpbGUK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL2EucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL2IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL3NpbmdsZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNh bXBsZXMvcnVzdC9ydXN0X2NocmRldi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVz dC9ydXN0X2VjaG9fc2VydmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1 c3RfZnMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9taW5pbWFsLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfbWlzY2Rldi5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0X21vZHVsZV9wYXJhbWV0ZXJzLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfbmV0ZmlsdGVyLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfcGxhdGZvcm0ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzYW1wbGVzL3J1c3QvcnVzdF9wcmludC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMv cnVzdC9ydXN0X3JhbmRvbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0 X3NlbGZ0ZXN0cy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0X3NlbWFw aG9yZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0X3NlbWFwaG9yZV9j LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9zdGFja19wcm9iaW5nLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3Rfc3luYy5ycwogY3JlYXRlIG1v ZGUgMTAwNzU1IHNjcmlwdHMvZ2VuZXJhdGVfcnVzdF9hbmFseXplci5weQogY3JlYXRlIG1vZGUg MTAwNjQ0IHNjcmlwdHMvZ2VuZXJhdGVfcnVzdF90YXJnZXQucnMKIGNyZWF0ZSBtb2RlIDEwMDc1 NSBzY3JpcHRzL2lzX3J1c3RfbW9kdWxlLnNoCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2NyaXB0cy9y dXN0LWlzLWF2YWlsYWJsZS1iaW5kZ2VuLWxpYmNsYW5nLmgKIGNyZWF0ZSBtb2RlIDEwMDc1NSBz Y3JpcHRzL3J1c3QtaXMtYXZhaWxhYmxlLnNoCiBjcmVhdGUgbW9kZSAxMDA3NTUgc2NyaXB0cy9y dXN0ZG9jX3Rlc3RfYnVpbGRlci5weQogY3JlYXRlIG1vZGUgMTAwNzU1IHNjcmlwdHMvcnVzdGRv Y190ZXN0X2dlbi5weQoKCmJhc2UtY29tbWl0OiAzZDdjYjZiMDRjM2YzMTE1NzE5MjM1Y2M2ODY2 YjEwMzI2ZGUzNGNkCi0tIAoyLjM3LjEKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LXJpc2N2Cg== 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.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (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 24865C19F2D for ; Tue, 2 Aug 2022 01:52:17 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4LxdKC4Zptz3bgC for ; Tue, 2 Aug 2022 11:52:15 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=GVKBjD1E; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=kernel.org (client-ip=145.40.73.55; helo=sin.source.kernel.org; envelope-from=ojeda@kernel.org; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=GVKBjD1E; dkim-atps=neutral Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4LxdJS2vQgz2xHQ for ; Tue, 2 Aug 2022 11:51:36 +1000 (AEST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 544F6CE16F0; Tue, 2 Aug 2022 01:51:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C087AC433D6; Tue, 2 Aug 2022 01:51:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1659405089; bh=3xVDpblfOW7CRBHtYe2gNVEKPz4HST8R7lJSNE6BaVE=; h=From:To:Cc:Subject:Date:From; b=GVKBjD1EJN4dOLawblA1z8mMlS1FDXGh2nbXJ/tOvHoLFcgGwcyIEfnaOnDsfo1ce gNtXgUcCnaFdG2kL6xTigY1xJHR/EvTD2f+fv45wtjK76opvDViK6FgkmkYn++RSSj vU/OlgZV9zEI8z+Vgppc3bWsCWF+QsehqAiVd17dMbAsx7QJAzHBGYcgYgKi/Ax0Mc gCtkFh1ScY2phKKmSeDZQSJh1FWwybHhMK1j2IrTsSmKGbvhNs0odtcK+tOJgtXroU OxnZfC2VWvt2/OTCg6FuqeVyx4SWCVhisFEcI1LURYsHYyxqhxlKqsWzizpNzr9qN6 mcmhY+Y9LnIdQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Subject: [PATCH v8 00/31] Rust support Date: Tue, 2 Aug 2022 03:49:47 +0200 Message-Id: <20220802015052.10452-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-um@lists.infradead.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-gpio@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , live-patching@vger.kernel.org, linux-riscv@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Rust support This is the patch series (v8) to add support for Rust as a second language to the Linux kernel. If you are interested in following this effort, please join us in the mailing list at: rust-for-linux@vger.kernel.org and take a look at the project itself at: https://github.com/Rust-for-Linux As usual, special thanks go to ISRG (Internet Security Research Group) and Google for their financial support on this endeavor. Cheers, Miguel -- # Rust support This cover letter explains the major changes and updates done since the previous ones. For those, please see: RFC: https://lore.kernel.org/lkml/20210414184604.23473-1-ojeda@kernel.org/ v1: https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/ v2: https://lore.kernel.org/lkml/20211206140313.5653-1-ojeda@kernel.org/ v3: https://lore.kernel.org/lkml/20220117053349.6804-1-ojeda@kernel.org/ v4: https://lore.kernel.org/lkml/20220212130410.6901-1-ojeda@kernel.org/ v5: https://lore.kernel.org/lkml/20220317181032.15436-1-ojeda@kernel.org/ v6: https://lore.kernel.org/lkml/20220507052451.12890-1-ojeda@kernel.org/ v7: https://lore.kernel.org/lkml/20220523020209.11810-1-ojeda@kernel.org/ ## Infrastructure updates There have been several improvements to the overall Rust support: - Upgraded toolchain and `alloc` to Rust 1.62.0 from 1.60.0. Rust 1.61.0 stabilized `feature(const_fn_trait_bound)` that we are using. - Moved bindings into their own crate, `bindings`. This greatly improves build time when only the `kernel` crate changes (which previously contained the bindings). - Disabled unused `bindgen`'s layout test generation, which makes rust-analyzer significantly faster to run. - `bindgen` can now be detected via the `__BINDGEN__` macro, which we currently use to workaround an issue with the `btf_type_tag` attribute. - Reimplemented `concat_idents!` (an unstable standard library macro) as a proc macro, which means we no longer rely on `feature(concat_idents)`. Furthermore, the proc macro allows to refer to local variables. - Reimplemented `static_assert!` in a more idiomatic way, now that `core::assert!()` is supported in const contexts. - Made `build_error!`' work under `RUST_BUILD_ASSERT_{WARN,ALLOW}` for modules. - Removed `__mulodi4` panicking stub. - Added `kernel/configs/rust.config`. - Added a (temporary) self-test module for "pure" Rust tests. - Changed `.i` macro expanded files to the `.rsi` extension and clarified that they are not intended to be compilable. - Dropped support for compiling the Rust side with a different optimization level than the C side. - The Linux/Tux SVG logo (recently upstreamed) is used for the generated Rust documentation, instead of the GIF one. The `COPYING-logo` file is bundled too. - Other cleanups, fixes and improvements. ## Abstractions and driver updates Some of the improvements to the abstractions and example drivers are: - Filesystem support (`fs` module), including: + `INode` type (which wraps `struct inode`). + `DEntry` type (which wraps `struct dentry`). + `Filename` type (which wraps `struct filename`). + `Registration` type. + `Type` and `Context` traits. + `SuperBlock` type (which wraps `struct super_block` and takes advantage of typestates for its initialization). + File system parameters support (with a `Value` enum; `Spec*` and `Constant*` types, `define_fs_params!` macro...). + File system flags. + `module_fs!` macro to simplify registering kernel modules that only implement a single file system. + A file system sample. - Workqueues support (`workqueue` module), including a `Work` type (which wraps `struct work_struct`), a `Queue` type (which wraps `struct workqueue_struct`), access to different system queues as well as macros to simplify usage, e.g.: spawn_work_item!(workqueue::system(), || pr_info!("Hi!\n"))?; - More asynchronous support (`kasync` module), including: + Executor support (including `Task` and `Executor` traits, a `AutoStopHandle` type that automatically stops the executor on drop, a `spawn_task!` macro that automatically defines a new lockdep lock class...). + A workqueue-based executor, which allows to run tasks on dedicated or shared thread pools that are managed by existing C kernel infrastructure, e.g.: let mut handle = Executor::try_new(workqueue::system())?; spawn_task!(handle.executor(), async { pr_info!("First workqueue task\n"); })?; spawn_task!(handle.executor(), async { pr_info!("Second workqueue task\n"); })?; handle.detach(); + A `yield_now()` function that yields execution of the current task so that other ones may execute (but keeps it runnable so that it will run again as soon as the executor is available again), e.g.: async fn example() { pr_info!("Before yield\n"); yield_now().await; pr_info!("After yield\n"); } + `AsyncRevocable` type (in the `revocable` module), which allows access to objects to be revoked without having to wait for existing users to complete. This is useful to drop futures in tasks when executors are being torn down. + An asynchronous TCP echo server sample. - Introduced support for handling interrupts: `[Threaded]Handler` traits, `[Threaded]Registration` types, a `Return` enum (as the return value from handlers) and flags: struct Example; impl irq::Handler for Example { type Data = Box; fn handle_irq(_data: &u32) -> irq::Return { irq::Return::None } } fn request_irq(irq: u32, data: Box) -> Result> { irq::Registration::try_new( irq, data, irq::flags::SHARED, fmt!("example_{irq}") ) } - Introduced the `#[vtable]` proc macro attribute to simplify how function pointer tables like `struct file_operations` are used by Rust kernel modules. Previously, users had to call a `declare_*_operations!` macro which required passing the defined operations: impl file::Operations for SomeFile { ... declare_file_operations!(read, write, ioctl, ...); ... } Instead, now it is only required that they annotate the `impl` block with the attribute: #[vtable] impl file::Operations for SomeFile { ... } The proc macro will generate a boolean `HAS_*` associated constant for each method in the trait, indicating if the implementer has overridden a method. - Added `unsafe_list::List`, an intrusive circular doubly-linked list, meant to be used as the basis for other linked lists. It is also used in the workqueue-based executor to keep track of all tasks since it is cheaper than other options. - Initial RCU support: a `Guard` type that represents evidence that the RCU read side lock is held on the current thread/CPU. In addition, `Revocable` now uses this new abstraction so that users can provide evidence of the RCU read side lock being held when accessing the protected object, e.g.: fn add_pair(value: &Revocable<(u32, u32)>) -> Option { let guard = rcu::read_lock(); let pair = value.try_access_with_guard(&guard)?; Some(pair.0 + pair.1) } - Added `StaticRef` which allows the creation of "reference-counted" globals; i.e. allows to define static variables that can be used when `Ref` or `RefBorrow<'_, T>` are expected. This, in turn, allows to have functions that return shared resources (e.g. a global workqueue) without allocations (the shared object is statically allocated). - Added `Task::spawn()` function to create and automatically run kernel threads easily, e.g.: for i in 0..10 { Task::spawn(fmt!("test{i}"), threadfn).unwrap(); } - Added `Task::wake_up()` method. - Converted `Task` to use `ARef` to unify the usage of all ref-counted C structures. - Initial support for delays/sleeps (`delay` module) with a basic `coarse_sleep()` function that wraps the C side `msleep()` and takes advantage of the `Duration` standard library type: coarse_sleep(Duration::from_millis(20)); - Added file flags (to further reduce `bindings::*` usage), e.g.: let blocking = (file.flags() & file::flags::O_NONBLOCK) == 0; - Added `gpio_chip_register!` and `gpio_irq_chip_register!` macros which automatically define the required lock classes. - Removal of `bindings::lock_class_key` from drivers. This gets us closer to eventually make bindings private to the `kernel` crate. - Moved usage of `ManuallyDrop` to `MaybeUninit` in `Revocable`, which was unsound. - Other cleanups, fixes and improvements. ## Patch series updates The patch series has been reorganized a bit since last time: - The `include/linux/` changes for the C helpers have been moved into their own small patches, which can be taken independently as prerequisite patches if needed. - Now that the bindings are in their own `bindings` crate, they also get their own patch. - There is a new patch that adds the `kernel/configs/rust.config`. - One of the `kallsyms` patches has been split into three smaller ones. - Cleaned up some "exceeds 100 columns" `checkpatch.pl` warnings. With this final cleanup, the remaining warnings (of all kinds) are either false positives, or cannot be changed without diverging with upstream `alloc` or would make things look worse. ## Patch series status The Rust support is still to be considered experimental. However, support is good enough that kernel developers can start working on the Rust abstractions for subsystems and write drivers and other modules. The current series will appear in the next `linux-next`, as usual. Similarly, the preview docs for this series can be seen at: https://rust-for-linux.github.io/docs/kernel/ As usual, please see the following link for the live list of unstable Rust features we are using: https://github.com/Rust-for-Linux/linux/issues/2 ## Conferences, meetings and liaisons Join us in LPC 2022 (Linux Plumbers Conference) for the Rust MC (microconference)! The schedule is available at: https://lpc.events/event/16/sessions/150/ We will be talking about GCC Rust (the Rust frontend for GCC), `rustc_codegen_gcc` (the GCC backend for `rustc`), Rust for Linux, the Rust NVMe driver, the integration of Rust with the Kernel Testing Service and Rust in the Kernel (via eBPF). In addition, I would like to personally thank Google and ISRG (Internet Security Research Group) for sponsoring Kangrejos, the Rust for Linux workshop: https://kangrejos.com Furthermore, we would like to thank the venues we were invited to: - Linux Foundation Live Mentorship Series - Open Source Summit North America - Huawei Global Software Technology Summit ## Related news The GCC Steering Committee accepted the contribution of the Rust frontend (GCC Rust). Its first released version (experimental, disabled by default) should appear in GCC 13. The first round of patches has been posted to the gcc-patches mailing list. `rustc_codegen_gcc` (the GCC backend for `rustc`) has seen enough progress on SIMD support to compile `stdarch`. In addition, more prerequisite patches are making their way into GCC. ## Acknowledgements The signatures in the main commits correspond to the people that wrote code that has ended up in them at the present time. For details on contributions to code and discussions, please see our repository: https://github.com/Rust-for-Linux/linux However, we would like to give credit to everyone that has contributed in one way or another to the Rust for Linux project. Since the previous cover letter: - Nick Desaulniers, Joe Perches, Masahiro Yamada and Jarkko Sakkinen for their reviews of some of the v7 patches. - Daniel Latypov, Brendan Higgins and Shuah Khan for picking up the KUnit prerequisite patch. - As usual, Björn Roy Baron (bjorn3) and Gary Guo for all the input on Rust compiler details, reviews and suggestions. - Andreas Hindborg for working on the NVMe driver, as well as adding atomic allocations for `Box` and allowing to use GFP flags for `KernelAllocator`. - Li Hongyu for working on a virtio abstraction. - Boqun Feng for working on adding an alloc alignment test. - Andreas Reindl for working on adding missing `SAFETY` comments. - Anhad Singh for working on adding the `new_with_flags` method to `Pages`. - Finn Behrens for working on making it possible to compile the kernel on macOS with Rust enabled. - Roel Kluin for working on code refactorings. - Wei Liu for taking the time to answer questions from newcomers in Zulip. - Philip Li, Yujie Liu et al. for continuing their work on adding Rust support to the Intel 0DAY/LKP kernel test robot. - Philip Herron and Arthur Cohen (and his supporters Open Source Security and Embecosm) et al. for their ongoing work on GCC Rust. - Antoni Boucher (and his supporters) et al. for their ongoing work on `rustc_codegen_gcc`. - Emilio Cobos Álvarez et. al. for their work on `bindgen`, including on issues that affect the kernel. - Mats Larsen, Marc Poulhiès et al. for their ongoing work on improving Rust support in Compiler Explorer. - Many folks that have reported issues, tested the project, helped spread the word, joined discussions and contributed in other ways! Please see also the acknowledgements on the previous cover letters. Boqun Feng (2): kallsyms: use `sizeof` instead of hardcoded size kallsyms: avoid hardcoding buffer size Gary Guo (2): rust: add `build_error` crate vsprintf: add new `%pA` format specifier Miguel Ojeda (19): kallsyms: add static relationship between `KSYM_NAME_LEN{,_BUFFER}` kallsyms: support "big" kernel symbols kallsyms: increase maximum kernel symbol length to 512 rust: add C helpers rust: add `compiler_builtins` crate rust: import upstream `alloc` crate rust: adapt `alloc` crate to the kernel rust: add `macros` crate rust: add `bindings` crate rust: export generated symbols scripts: checkpatch: diagnose uses of `%pA` in the C side as errors scripts: checkpatch: enable language-independent checks for Rust scripts: add `rustdoc_test_{builder,gen}.py` scripts scripts: add `generate_rust_analyzer.py` scripts scripts: decode_stacktrace: demangle Rust symbols docs: add Rust documentation Kbuild: add Rust support samples: add Rust examples MAINTAINERS: Rust Wedson Almeida Filho (8): workqueue: introduce `__INIT_WORK_WITH_KEY` locking/spinlock: introduce `__spin_lock_init` locking/spinlock: introduce `_raw_spin_lock_init` rust: add `kernel` crate's `sync` module rust: add `kernel` crate configs: add `rust` config [RFC] drivers: gpio: PrimeCell PL061 in Rust [RFC] drivers: android: Binder IPC in Rust .gitignore | 6 + .rustfmt.toml | 12 + Documentation/core-api/printk-formats.rst | 10 + Documentation/doc-guide/kernel-doc.rst | 3 + Documentation/index.rst | 1 + Documentation/kbuild/kbuild.rst | 17 + Documentation/kbuild/makefiles.rst | 50 +- Documentation/process/changes.rst | 41 + Documentation/rust/arch-support.rst | 23 + Documentation/rust/coding-guidelines.rst | 216 ++ Documentation/rust/general-information.rst | 79 + Documentation/rust/index.rst | 22 + Documentation/rust/quick-start.rst | 232 ++ MAINTAINERS | 15 + Makefile | 172 +- arch/Kconfig | 6 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 1 + arch/powerpc/Kconfig | 1 + arch/riscv/Kconfig | 1 + arch/riscv/Makefile | 5 + arch/um/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/x86/Makefile | 10 + drivers/android/Kconfig | 6 + drivers/android/Makefile | 2 + drivers/android/allocation.rs | 266 ++ drivers/android/context.rs | 80 + drivers/android/defs.rs | 99 + drivers/android/node.rs | 476 +++ drivers/android/process.rs | 961 +++++ drivers/android/range_alloc.rs | 189 + drivers/android/rust_binder.rs | 106 + drivers/android/thread.rs | 871 +++++ drivers/android/transaction.rs | 326 ++ drivers/gpio/Kconfig | 8 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio_pl061_rust.rs | 367 ++ include/linux/compiler_types.h | 6 +- include/linux/kallsyms.h | 2 +- include/linux/spinlock.h | 17 +- include/linux/workqueue.h | 21 +- include/uapi/linux/android/binder.h | 30 +- init/Kconfig | 46 +- kernel/configs/rust.config | 1 + kernel/kallsyms.c | 26 +- kernel/livepatch/core.c | 4 +- lib/Kconfig.debug | 82 + lib/vsprintf.c | 13 + rust/.gitignore | 10 + rust/Makefile | 415 +++ rust/alloc/README.md | 33 + rust/alloc/alloc.rs | 440 +++ rust/alloc/borrow.rs | 498 +++ rust/alloc/boxed.rs | 2026 +++++++++++ rust/alloc/boxed/thin.rs | 219 ++ rust/alloc/collections/mod.rs | 156 + rust/alloc/ffi/c_str.rs | 1203 ++++++ rust/alloc/ffi/mod.rs | 93 + rust/alloc/fmt.rs | 614 ++++ rust/alloc/lib.rs | 239 ++ rust/alloc/macros.rs | 128 + rust/alloc/raw_vec.rs | 567 +++ rust/alloc/slice.rs | 1295 +++++++ rust/alloc/str.rs | 641 ++++ rust/alloc/string.rs | 2944 +++++++++++++++ rust/alloc/vec/drain.rs | 186 + rust/alloc/vec/drain_filter.rs | 145 + rust/alloc/vec/into_iter.rs | 365 ++ rust/alloc/vec/is_zero.rs | 120 + rust/alloc/vec/mod.rs | 3420 ++++++++++++++++++ rust/alloc/vec/partial_eq.rs | 49 + rust/alloc/vec/set_len_on_drop.rs | 30 + rust/alloc/vec/spec_extend.rs | 174 + rust/bindgen_parameters | 21 + rust/bindings/bindings_helper.h | 49 + rust/bindings/lib.rs | 57 + rust/build_error.rs | 29 + rust/compiler_builtins.rs | 79 + rust/exports.c | 21 + rust/helpers.c | 679 ++++ rust/kernel/allocator.rs | 64 + rust/kernel/amba.rs | 261 ++ rust/kernel/build_assert.rs | 83 + rust/kernel/chrdev.rs | 206 ++ rust/kernel/clk.rs | 79 + rust/kernel/cred.rs | 46 + rust/kernel/delay.rs | 104 + rust/kernel/device.rs | 527 +++ rust/kernel/driver.rs | 442 +++ rust/kernel/error.rs | 564 +++ rust/kernel/file.rs | 887 +++++ rust/kernel/fs.rs | 846 +++++ rust/kernel/fs/param.rs | 553 +++ rust/kernel/gpio.rs | 505 +++ rust/kernel/hwrng.rs | 210 ++ rust/kernel/io_buffer.rs | 153 + rust/kernel/io_mem.rs | 278 ++ rust/kernel/iov_iter.rs | 81 + rust/kernel/irq.rs | 681 ++++ rust/kernel/kasync.rs | 50 + rust/kernel/kasync/executor.rs | 154 + rust/kernel/kasync/executor/workqueue.rs | 291 ++ rust/kernel/kasync/net.rs | 322 ++ rust/kernel/kunit.rs | 91 + rust/kernel/lib.rs | 267 ++ rust/kernel/linked_list.rs | 247 ++ rust/kernel/miscdev.rs | 290 ++ rust/kernel/mm.rs | 149 + rust/kernel/module_param.rs | 499 +++ rust/kernel/net.rs | 392 ++ rust/kernel/net/filter.rs | 447 +++ rust/kernel/of.rs | 63 + rust/kernel/pages.rs | 144 + rust/kernel/platform.rs | 223 ++ rust/kernel/power.rs | 118 + rust/kernel/prelude.rs | 36 + rust/kernel/print.rs | 406 +++ rust/kernel/random.rs | 42 + rust/kernel/raw_list.rs | 361 ++ rust/kernel/rbtree.rs | 563 +++ rust/kernel/revocable.rs | 425 +++ rust/kernel/security.rs | 38 + rust/kernel/static_assert.rs | 34 + rust/kernel/std_vendor.rs | 161 + rust/kernel/str.rs | 597 +++ rust/kernel/sync.rs | 169 + rust/kernel/sync/arc.rs | 582 +++ rust/kernel/sync/condvar.rs | 140 + rust/kernel/sync/guard.rs | 159 + rust/kernel/sync/locked_by.rs | 111 + rust/kernel/sync/mutex.rs | 149 + rust/kernel/sync/nowait.rs | 188 + rust/kernel/sync/rcu.rs | 52 + rust/kernel/sync/revocable.rs | 246 ++ rust/kernel/sync/rwsem.rs | 196 + rust/kernel/sync/seqlock.rs | 201 + rust/kernel/sync/smutex.rs | 290 ++ rust/kernel/sync/spinlock.rs | 357 ++ rust/kernel/sysctl.rs | 199 + rust/kernel/task.rs | 239 ++ rust/kernel/types.rs | 705 ++++ rust/kernel/unsafe_list.rs | 680 ++++ rust/kernel/user_ptr.rs | 175 + rust/kernel/workqueue.rs | 512 +++ rust/macros/concat_idents.rs | 23 + rust/macros/helpers.rs | 79 + rust/macros/lib.rs | 191 + rust/macros/module.rs | 655 ++++ rust/macros/vtable.rs | 95 + samples/Kconfig | 2 + samples/Makefile | 1 + samples/rust/Kconfig | 165 + samples/rust/Makefile | 19 + samples/rust/hostprogs/.gitignore | 3 + samples/rust/hostprogs/Makefile | 5 + samples/rust/hostprogs/a.rs | 7 + samples/rust/hostprogs/b.rs | 5 + samples/rust/hostprogs/single.rs | 12 + samples/rust/rust_chrdev.rs | 49 + samples/rust/rust_echo_server.rs | 60 + samples/rust/rust_fs.rs | 59 + samples/rust/rust_minimal.rs | 35 + samples/rust/rust_miscdev.rs | 142 + samples/rust/rust_module_parameters.rs | 69 + samples/rust/rust_netfilter.rs | 54 + samples/rust/rust_platform.rs | 22 + samples/rust/rust_print.rs | 54 + samples/rust/rust_random.rs | 60 + samples/rust/rust_selftests.rs | 99 + samples/rust/rust_semaphore.rs | 170 + samples/rust/rust_semaphore_c.c | 212 ++ samples/rust/rust_stack_probing.rs | 36 + samples/rust/rust_sync.rs | 93 + scripts/.gitignore | 1 + scripts/Kconfig.include | 6 +- scripts/Makefile | 3 + scripts/Makefile.build | 60 + scripts/Makefile.debug | 10 + scripts/Makefile.host | 34 +- scripts/Makefile.lib | 12 + scripts/Makefile.modfinal | 8 +- scripts/cc-version.sh | 12 +- scripts/checkpatch.pl | 12 +- scripts/decode_stacktrace.sh | 14 + scripts/generate_rust_analyzer.py | 141 + scripts/generate_rust_target.rs | 232 ++ scripts/is_rust_module.sh | 16 + scripts/kallsyms.c | 47 +- scripts/kconfig/confdata.c | 75 + scripts/min-tool-version.sh | 6 + scripts/rust-is-available-bindgen-libclang.h | 2 + scripts/rust-is-available.sh | 160 + scripts/rustdoc_test_builder.py | 59 + scripts/rustdoc_test_gen.py | 164 + tools/include/linux/kallsyms.h | 2 +- tools/lib/perf/include/perf/event.h | 2 +- tools/lib/symbol/kallsyms.h | 2 +- 198 files changed, 43688 insertions(+), 75 deletions(-) create mode 100644 .rustfmt.toml create mode 100644 Documentation/rust/arch-support.rst create mode 100644 Documentation/rust/coding-guidelines.rst create mode 100644 Documentation/rust/general-information.rst create mode 100644 Documentation/rust/index.rst create mode 100644 Documentation/rust/quick-start.rst create mode 100644 drivers/android/allocation.rs create mode 100644 drivers/android/context.rs create mode 100644 drivers/android/defs.rs create mode 100644 drivers/android/node.rs create mode 100644 drivers/android/process.rs create mode 100644 drivers/android/range_alloc.rs create mode 100644 drivers/android/rust_binder.rs create mode 100644 drivers/android/thread.rs create mode 100644 drivers/android/transaction.rs create mode 100644 drivers/gpio/gpio_pl061_rust.rs create mode 100644 kernel/configs/rust.config create mode 100644 rust/.gitignore create mode 100644 rust/Makefile create mode 100644 rust/alloc/README.md create mode 100644 rust/alloc/alloc.rs create mode 100644 rust/alloc/borrow.rs create mode 100644 rust/alloc/boxed.rs create mode 100644 rust/alloc/boxed/thin.rs create mode 100644 rust/alloc/collections/mod.rs create mode 100644 rust/alloc/ffi/c_str.rs create mode 100644 rust/alloc/ffi/mod.rs create mode 100644 rust/alloc/fmt.rs create mode 100644 rust/alloc/lib.rs create mode 100644 rust/alloc/macros.rs create mode 100644 rust/alloc/raw_vec.rs create mode 100644 rust/alloc/slice.rs create mode 100644 rust/alloc/str.rs create mode 100644 rust/alloc/string.rs create mode 100644 rust/alloc/vec/drain.rs create mode 100644 rust/alloc/vec/drain_filter.rs create mode 100644 rust/alloc/vec/into_iter.rs create mode 100644 rust/alloc/vec/is_zero.rs create mode 100644 rust/alloc/vec/mod.rs create mode 100644 rust/alloc/vec/partial_eq.rs create mode 100644 rust/alloc/vec/set_len_on_drop.rs create mode 100644 rust/alloc/vec/spec_extend.rs create mode 100644 rust/bindgen_parameters create mode 100644 rust/bindings/bindings_helper.h create mode 100644 rust/bindings/lib.rs create mode 100644 rust/build_error.rs create mode 100644 rust/compiler_builtins.rs create mode 100644 rust/exports.c create mode 100644 rust/helpers.c create mode 100644 rust/kernel/allocator.rs create mode 100644 rust/kernel/amba.rs create mode 100644 rust/kernel/build_assert.rs create mode 100644 rust/kernel/chrdev.rs create mode 100644 rust/kernel/clk.rs create mode 100644 rust/kernel/cred.rs create mode 100644 rust/kernel/delay.rs create mode 100644 rust/kernel/device.rs create mode 100644 rust/kernel/driver.rs create mode 100644 rust/kernel/error.rs create mode 100644 rust/kernel/file.rs create mode 100644 rust/kernel/fs.rs create mode 100644 rust/kernel/fs/param.rs create mode 100644 rust/kernel/gpio.rs create mode 100644 rust/kernel/hwrng.rs create mode 100644 rust/kernel/io_buffer.rs create mode 100644 rust/kernel/io_mem.rs create mode 100644 rust/kernel/iov_iter.rs create mode 100644 rust/kernel/irq.rs create mode 100644 rust/kernel/kasync.rs create mode 100644 rust/kernel/kasync/executor.rs create mode 100644 rust/kernel/kasync/executor/workqueue.rs create mode 100644 rust/kernel/kasync/net.rs create mode 100644 rust/kernel/kunit.rs create mode 100644 rust/kernel/lib.rs create mode 100644 rust/kernel/linked_list.rs create mode 100644 rust/kernel/miscdev.rs create mode 100644 rust/kernel/mm.rs create mode 100644 rust/kernel/module_param.rs create mode 100644 rust/kernel/net.rs create mode 100644 rust/kernel/net/filter.rs create mode 100644 rust/kernel/of.rs create mode 100644 rust/kernel/pages.rs create mode 100644 rust/kernel/platform.rs create mode 100644 rust/kernel/power.rs create mode 100644 rust/kernel/prelude.rs create mode 100644 rust/kernel/print.rs create mode 100644 rust/kernel/random.rs create mode 100644 rust/kernel/raw_list.rs create mode 100644 rust/kernel/rbtree.rs create mode 100644 rust/kernel/revocable.rs create mode 100644 rust/kernel/security.rs create mode 100644 rust/kernel/static_assert.rs create mode 100644 rust/kernel/std_vendor.rs create mode 100644 rust/kernel/str.rs create mode 100644 rust/kernel/sync.rs create mode 100644 rust/kernel/sync/arc.rs create mode 100644 rust/kernel/sync/condvar.rs create mode 100644 rust/kernel/sync/guard.rs create mode 100644 rust/kernel/sync/locked_by.rs create mode 100644 rust/kernel/sync/mutex.rs create mode 100644 rust/kernel/sync/nowait.rs create mode 100644 rust/kernel/sync/rcu.rs create mode 100644 rust/kernel/sync/revocable.rs create mode 100644 rust/kernel/sync/rwsem.rs create mode 100644 rust/kernel/sync/seqlock.rs create mode 100644 rust/kernel/sync/smutex.rs create mode 100644 rust/kernel/sync/spinlock.rs create mode 100644 rust/kernel/sysctl.rs create mode 100644 rust/kernel/task.rs create mode 100644 rust/kernel/types.rs create mode 100644 rust/kernel/unsafe_list.rs create mode 100644 rust/kernel/user_ptr.rs create mode 100644 rust/kernel/workqueue.rs create mode 100644 rust/macros/concat_idents.rs create mode 100644 rust/macros/helpers.rs create mode 100644 rust/macros/lib.rs create mode 100644 rust/macros/module.rs create mode 100644 rust/macros/vtable.rs create mode 100644 samples/rust/Kconfig create mode 100644 samples/rust/Makefile create mode 100644 samples/rust/hostprogs/.gitignore create mode 100644 samples/rust/hostprogs/Makefile create mode 100644 samples/rust/hostprogs/a.rs create mode 100644 samples/rust/hostprogs/b.rs create mode 100644 samples/rust/hostprogs/single.rs create mode 100644 samples/rust/rust_chrdev.rs create mode 100644 samples/rust/rust_echo_server.rs create mode 100644 samples/rust/rust_fs.rs create mode 100644 samples/rust/rust_minimal.rs create mode 100644 samples/rust/rust_miscdev.rs create mode 100644 samples/rust/rust_module_parameters.rs create mode 100644 samples/rust/rust_netfilter.rs create mode 100644 samples/rust/rust_platform.rs create mode 100644 samples/rust/rust_print.rs create mode 100644 samples/rust/rust_random.rs create mode 100644 samples/rust/rust_selftests.rs create mode 100644 samples/rust/rust_semaphore.rs create mode 100644 samples/rust/rust_semaphore_c.c create mode 100644 samples/rust/rust_stack_probing.rs create mode 100644 samples/rust/rust_sync.rs create mode 100755 scripts/generate_rust_analyzer.py create mode 100644 scripts/generate_rust_target.rs create mode 100755 scripts/is_rust_module.sh create mode 100644 scripts/rust-is-available-bindgen-libclang.h create mode 100755 scripts/rust-is-available.sh create mode 100755 scripts/rustdoc_test_builder.py create mode 100755 scripts/rustdoc_test_gen.py base-commit: 3d7cb6b04c3f3115719235cc6866b10326de34cd -- 2.37.1 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id A1374C00144 for ; Tue, 2 Aug 2022 01:53:04 +0000 (UTC) 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:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=L6VuEFk0sv1bHXfYjDPuTGPpxtI/7y052BL7/BgGV6o=; b=314RFald/+4Ot4 ycbQWGp13i4i9/lRbY/+lmriP4QnaBNXpzR3jd08j3CMZyhH2UHsFy7j2BdqOuXHgeMXpL/H7tfJz a54zeITpRc1XUKHOszbZB/SXYIOE2qTZ0zN+0j9m3nM4FnZLZBhksf3wZiNwSxil00SfjS1ofjgw1 d6OCc81oC1TXHHeTQLxDVdIFk+pri+4zZJ5cU+puerFHtkgQCLihX2IxgF3OK5aLJJ9HUFzT8hbXL HlE+mt+IO1RM61BZeA+M5zWaEBWTihDbhjEJkwQddFk6L77fwhjRXR1CoJnXJXrAEFM8vIYUXDAVI 7jMxPwLrdCMOinHzqjvg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oIh4T-009mnz-Cj; Tue, 02 Aug 2022 01:51:46 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oIh4M-009mmG-QC; Tue, 02 Aug 2022 01:51:43 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 544F6CE16F0; Tue, 2 Aug 2022 01:51:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C087AC433D6; Tue, 2 Aug 2022 01:51:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1659405089; bh=3xVDpblfOW7CRBHtYe2gNVEKPz4HST8R7lJSNE6BaVE=; h=From:To:Cc:Subject:Date:From; b=GVKBjD1EJN4dOLawblA1z8mMlS1FDXGh2nbXJ/tOvHoLFcgGwcyIEfnaOnDsfo1ce gNtXgUcCnaFdG2kL6xTigY1xJHR/EvTD2f+fv45wtjK76opvDViK6FgkmkYn++RSSj vU/OlgZV9zEI8z+Vgppc3bWsCWF+QsehqAiVd17dMbAsx7QJAzHBGYcgYgKi/Ax0Mc gCtkFh1ScY2phKKmSeDZQSJh1FWwybHhMK1j2IrTsSmKGbvhNs0odtcK+tOJgtXroU OxnZfC2VWvt2/OTCg6FuqeVyx4SWCVhisFEcI1LURYsHYyxqhxlKqsWzizpNzr9qN6 mcmhY+Y9LnIdQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-um@lists.infradead.org, live-patching@vger.kernel.org Subject: [PATCH v8 00/31] Rust support Date: Tue, 2 Aug 2022 03:49:47 +0200 Message-Id: <20220802015052.10452-1-ojeda@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220801_185139_272000_55F620A4 X-CRM114-Status: GOOD ( 37.88 ) 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 UnVzdCBzdXBwb3J0CgpUaGlzIGlzIHRoZSBwYXRjaCBzZXJpZXMgKHY4KSB0byBhZGQgc3VwcG9y dCBmb3IgUnVzdCBhcyBhIHNlY29uZApsYW5ndWFnZSB0byB0aGUgTGludXgga2VybmVsLgoKSWYg eW91IGFyZSBpbnRlcmVzdGVkIGluIGZvbGxvd2luZyB0aGlzIGVmZm9ydCwgcGxlYXNlIGpvaW4g dXMgaW4KdGhlIG1haWxpbmcgbGlzdCBhdDoKCiAgICBydXN0LWZvci1saW51eEB2Z2VyLmtlcm5l bC5vcmcKCmFuZCB0YWtlIGEgbG9vayBhdCB0aGUgcHJvamVjdCBpdHNlbGYgYXQ6CgogICAgaHR0 cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4CgpBcyB1c3VhbCwgc3BlY2lhbCB0aGFua3Mg Z28gdG8gSVNSRyAoSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gKR3JvdXApIGFuZCBHb29nbGUg Zm9yIHRoZWlyIGZpbmFuY2lhbCBzdXBwb3J0IG9uIHRoaXMgZW5kZWF2b3IuCgpDaGVlcnMsCk1p Z3VlbAoKLS0KCiMgUnVzdCBzdXBwb3J0CgpUaGlzIGNvdmVyIGxldHRlciBleHBsYWlucyB0aGUg bWFqb3IgY2hhbmdlcyBhbmQgdXBkYXRlcyBkb25lIHNpbmNlCnRoZSBwcmV2aW91cyBvbmVzLiBG b3IgdGhvc2UsIHBsZWFzZSBzZWU6CgogICAgUkZDOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9s a21sLzIwMjEwNDE0MTg0NjA0LjIzNDczLTEtb2plZGFAa2VybmVsLm9yZy8KICAgIHYxOiAgaHR0 cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIxMDcwNDIwMjc1Ni4yOTEwNy0xLW9qZWRhQGtl cm5lbC5vcmcvCiAgICB2MjogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTEyMDYx NDAzMTMuNTY1My0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2MzogIGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xrbWwvMjAyMjAxMTcwNTMzNDkuNjgwNC0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2 NDogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjAyMTIxMzA0MTAuNjkwMS0xLW9q ZWRhQGtlcm5lbC5vcmcvCiAgICB2NTogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAy MjAzMTcxODEwMzIuMTU0MzYtMS1vamVkYUBrZXJuZWwub3JnLwogICAgdjY6ICBodHRwczovL2xv cmUua2VybmVsLm9yZy9sa21sLzIwMjIwNTA3MDUyNDUxLjEyODkwLTEtb2plZGFAa2VybmVsLm9y Zy8KICAgIHY3OiAgaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIyMDUyMzAyMDIwOS4x MTgxMC0xLW9qZWRhQGtlcm5lbC5vcmcvCgoKIyMgSW5mcmFzdHJ1Y3R1cmUgdXBkYXRlcwoKVGhl cmUgaGF2ZSBiZWVuIHNldmVyYWwgaW1wcm92ZW1lbnRzIHRvIHRoZSBvdmVyYWxsIFJ1c3Qgc3Vw cG9ydDoKCiAgLSBVcGdyYWRlZCB0b29sY2hhaW4gYW5kIGBhbGxvY2AgdG8gUnVzdCAxLjYyLjAg ZnJvbSAxLjYwLjAuCiAgICBSdXN0IDEuNjEuMCBzdGFiaWxpemVkIGBmZWF0dXJlKGNvbnN0X2Zu X3RyYWl0X2JvdW5kKWAgdGhhdAogICAgd2UgYXJlIHVzaW5nLgoKICAtIE1vdmVkIGJpbmRpbmdz IGludG8gdGhlaXIgb3duIGNyYXRlLCBgYmluZGluZ3NgLiBUaGlzIGdyZWF0bHkKICAgIGltcHJv dmVzIGJ1aWxkIHRpbWUgd2hlbiBvbmx5IHRoZSBga2VybmVsYCBjcmF0ZSBjaGFuZ2VzICh3aGlj aAogICAgcHJldmlvdXNseSBjb250YWluZWQgdGhlIGJpbmRpbmdzKS4KCiAgLSBEaXNhYmxlZCB1 bnVzZWQgYGJpbmRnZW5gJ3MgbGF5b3V0IHRlc3QgZ2VuZXJhdGlvbiwgd2hpY2ggbWFrZXMKICAg IHJ1c3QtYW5hbHl6ZXIgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdG8gcnVuLgoKICAtIGBiaW5kZ2Vu YCBjYW4gbm93IGJlIGRldGVjdGVkIHZpYSB0aGUgYF9fQklOREdFTl9fYCBtYWNybywgd2hpY2gK ICAgIHdlIGN1cnJlbnRseSB1c2UgdG8gd29ya2Fyb3VuZCBhbiBpc3N1ZSB3aXRoIHRoZSBgYnRm X3R5cGVfdGFnYAogICAgYXR0cmlidXRlLgoKICAtIFJlaW1wbGVtZW50ZWQgYGNvbmNhdF9pZGVu dHMhYCAoYW4gdW5zdGFibGUgc3RhbmRhcmQgbGlicmFyeQogICAgbWFjcm8pIGFzIGEgcHJvYyBt YWNybywgd2hpY2ggbWVhbnMgd2Ugbm8gbG9uZ2VyIHJlbHkgb24KICAgIGBmZWF0dXJlKGNvbmNh dF9pZGVudHMpYC4gRnVydGhlcm1vcmUsIHRoZSBwcm9jIG1hY3JvIGFsbG93cwogICAgdG8gcmVm ZXIgdG8gbG9jYWwgdmFyaWFibGVzLgoKICAtIFJlaW1wbGVtZW50ZWQgYHN0YXRpY19hc3NlcnQh YCBpbiBhIG1vcmUgaWRpb21hdGljIHdheSwgbm93IHRoYXQKICAgIGBjb3JlOjphc3NlcnQhKClg IGlzIHN1cHBvcnRlZCBpbiBjb25zdCBjb250ZXh0cy4KCiAgLSBNYWRlIGBidWlsZF9lcnJvciFg JyB3b3JrIHVuZGVyIGBSVVNUX0JVSUxEX0FTU0VSVF97V0FSTixBTExPV31gCiAgICBmb3IgbW9k dWxlcy4KCiAgLSBSZW1vdmVkIGBfX211bG9kaTRgIHBhbmlja2luZyBzdHViLgoKICAtIEFkZGVk IGBrZXJuZWwvY29uZmlncy9ydXN0LmNvbmZpZ2AuCgogIC0gQWRkZWQgYSAodGVtcG9yYXJ5KSBz ZWxmLXRlc3QgbW9kdWxlIGZvciAicHVyZSIgUnVzdCB0ZXN0cy4KCiAgLSBDaGFuZ2VkIGAuaWAg bWFjcm8gZXhwYW5kZWQgZmlsZXMgdG8gdGhlIGAucnNpYCBleHRlbnNpb24gYW5kCiAgICBjbGFy aWZpZWQgdGhhdCB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgY29tcGlsYWJsZS4KCiAgLSBE cm9wcGVkIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB0aGUgUnVzdCBzaWRlIHdpdGggYSBkaWZmZXJl bnQKICAgIG9wdGltaXphdGlvbiBsZXZlbCB0aGFuIHRoZSBDIHNpZGUuCgogIC0gVGhlIExpbnV4 L1R1eCBTVkcgbG9nbyAocmVjZW50bHkgdXBzdHJlYW1lZCkgaXMgdXNlZCBmb3IKICAgIHRoZSBn ZW5lcmF0ZWQgUnVzdCBkb2N1bWVudGF0aW9uLCBpbnN0ZWFkIG9mIHRoZSBHSUYgb25lLgogICAg VGhlIGBDT1BZSU5HLWxvZ29gIGZpbGUgaXMgYnVuZGxlZCB0b28uCgogIC0gT3RoZXIgY2xlYW51 cHMsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMuCgoKIyMgQWJzdHJhY3Rpb25zIGFuZCBkcml2ZXIg dXBkYXRlcwoKU29tZSBvZiB0aGUgaW1wcm92ZW1lbnRzIHRvIHRoZSBhYnN0cmFjdGlvbnMgYW5k IGV4YW1wbGUgZHJpdmVycyBhcmU6CgogIC0gRmlsZXN5c3RlbSBzdXBwb3J0IChgZnNgIG1vZHVs ZSksIGluY2x1ZGluZzoKCiAgICAgICsgYElOb2RlYCB0eXBlICh3aGljaCB3cmFwcyBgc3RydWN0 IGlub2RlYCkuCiAgICAgICsgYERFbnRyeWAgdHlwZSAod2hpY2ggd3JhcHMgYHN0cnVjdCBkZW50 cnlgKS4KICAgICAgKyBgRmlsZW5hbWVgIHR5cGUgKHdoaWNoIHdyYXBzIGBzdHJ1Y3QgZmlsZW5h bWVgKS4KICAgICAgKyBgUmVnaXN0cmF0aW9uYCB0eXBlLgogICAgICArIGBUeXBlYCBhbmQgYENv bnRleHRgIHRyYWl0cy4KICAgICAgKyBgU3VwZXJCbG9ja2AgdHlwZSAod2hpY2ggd3JhcHMgYHN0 cnVjdCBzdXBlcl9ibG9ja2AgYW5kIHRha2VzCiAgICAgICAgYWR2YW50YWdlIG9mIHR5cGVzdGF0 ZXMgZm9yIGl0cyBpbml0aWFsaXphdGlvbikuCiAgICAgICsgRmlsZSBzeXN0ZW0gcGFyYW1ldGVy cyBzdXBwb3J0ICh3aXRoIGEgYFZhbHVlYCBlbnVtOyBgU3BlYypgCiAgICAgICAgYW5kIGBDb25z dGFudCpgIHR5cGVzLCBgZGVmaW5lX2ZzX3BhcmFtcyFgIG1hY3JvLi4uKS4KICAgICAgKyBGaWxl IHN5c3RlbSBmbGFncy4KICAgICAgKyBgbW9kdWxlX2ZzIWAgbWFjcm8gdG8gc2ltcGxpZnkgcmVn aXN0ZXJpbmcga2VybmVsIG1vZHVsZXMgdGhhdAogICAgICAgIG9ubHkgaW1wbGVtZW50IGEgc2lu Z2xlIGZpbGUgc3lzdGVtLgogICAgICArIEEgZmlsZSBzeXN0ZW0gc2FtcGxlLgoKICAtIFdvcmtx dWV1ZXMgc3VwcG9ydCAoYHdvcmtxdWV1ZWAgbW9kdWxlKSwgaW5jbHVkaW5nIGEgYFdvcmtgIHR5 cGUKICAgICh3aGljaCB3cmFwcyBgc3RydWN0IHdvcmtfc3RydWN0YCksIGEgYFF1ZXVlYCB0eXBl ICh3aGljaCB3cmFwcwogICAgYHN0cnVjdCB3b3JrcXVldWVfc3RydWN0YCksIGFjY2VzcyB0byBk aWZmZXJlbnQgc3lzdGVtIHF1ZXVlcyBhcwogICAgd2VsbCBhcyBtYWNyb3MgdG8gc2ltcGxpZnkg dXNhZ2UsIGUuZy46CgogICAgICAgIHNwYXduX3dvcmtfaXRlbSEod29ya3F1ZXVlOjpzeXN0ZW0o KSwgfHwgcHJfaW5mbyEoIkhpIVxuIikpPzsKCiAgLSBNb3JlIGFzeW5jaHJvbm91cyBzdXBwb3J0 IChga2FzeW5jYCBtb2R1bGUpLCBpbmNsdWRpbmc6CgogICAgICArIEV4ZWN1dG9yIHN1cHBvcnQg KGluY2x1ZGluZyBgVGFza2AgYW5kIGBFeGVjdXRvcmAgdHJhaXRzLCBhCiAgICAgICAgYEF1dG9T dG9wSGFuZGxlYCB0eXBlIHRoYXQgYXV0b21hdGljYWxseSBzdG9wcyB0aGUgZXhlY3V0b3Igb24K ICAgICAgICBkcm9wLCBhIGBzcGF3bl90YXNrIWAgbWFjcm8gdGhhdCBhdXRvbWF0aWNhbGx5IGRl ZmluZXMgYSBuZXcKICAgICAgICBsb2NrZGVwIGxvY2sgY2xhc3MuLi4pLgoKICAgICAgKyBBIHdv cmtxdWV1ZS1iYXNlZCBleGVjdXRvciwgd2hpY2ggYWxsb3dzIHRvIHJ1biB0YXNrcyBvbgogICAg ICAgIGRlZGljYXRlZCBvciBzaGFyZWQgdGhyZWFkIHBvb2xzIHRoYXQgYXJlIG1hbmFnZWQgYnkg ZXhpc3RpbmcKICAgICAgICBDIGtlcm5lbCBpbmZyYXN0cnVjdHVyZSwgZS5nLjoKCiAgICAgICAg ICAgIGxldCBtdXQgaGFuZGxlID0gRXhlY3V0b3I6OnRyeV9uZXcod29ya3F1ZXVlOjpzeXN0ZW0o KSk/OwoKICAgICAgICAgICAgc3Bhd25fdGFzayEoaGFuZGxlLmV4ZWN1dG9yKCksIGFzeW5jIHsK ICAgICAgICAgICAgICAgIHByX2luZm8hKCJGaXJzdCB3b3JrcXVldWUgdGFza1xuIik7CiAgICAg ICAgICAgIH0pPzsKCiAgICAgICAgICAgIHNwYXduX3Rhc2shKGhhbmRsZS5leGVjdXRvcigpLCBh c3luYyB7CiAgICAgICAgICAgICAgICBwcl9pbmZvISgiU2Vjb25kIHdvcmtxdWV1ZSB0YXNrXG4i KTsKICAgICAgICAgICAgfSk/OwoKICAgICAgICAgICAgaGFuZGxlLmRldGFjaCgpOwoKICAgICAg KyBBIGB5aWVsZF9ub3coKWAgZnVuY3Rpb24gdGhhdCB5aWVsZHMgZXhlY3V0aW9uIG9mIHRoZSBj dXJyZW50CiAgICAgICAgdGFzayBzbyB0aGF0IG90aGVyIG9uZXMgbWF5IGV4ZWN1dGUgKGJ1dCBr ZWVwcyBpdCBydW5uYWJsZSBzbwogICAgICAgIHRoYXQgaXQgd2lsbCBydW4gYWdhaW4gYXMgc29v biBhcyB0aGUgZXhlY3V0b3IgaXMgYXZhaWxhYmxlCiAgICAgICAgYWdhaW4pLCBlLmcuOgoKICAg ICAgICAgICAgYXN5bmMgZm4gZXhhbXBsZSgpIHsKICAgICAgICAgICAgICAgIHByX2luZm8hKCJC ZWZvcmUgeWllbGRcbiIpOwogICAgICAgICAgICAgICAgeWllbGRfbm93KCkuYXdhaXQ7CiAgICAg ICAgICAgICAgICBwcl9pbmZvISgiQWZ0ZXIgeWllbGRcbiIpOwogICAgICAgICAgICB9CgogICAg ICArIGBBc3luY1Jldm9jYWJsZWAgdHlwZSAoaW4gdGhlIGByZXZvY2FibGVgIG1vZHVsZSksIHdo aWNoCiAgICAgICAgYWxsb3dzIGFjY2VzcyB0byBvYmplY3RzIHRvIGJlIHJldm9rZWQgd2l0aG91 dCBoYXZpbmcgdG8gd2FpdAogICAgICAgIGZvciBleGlzdGluZyB1c2VycyB0byBjb21wbGV0ZS4g VGhpcyBpcyB1c2VmdWwgdG8gZHJvcCBmdXR1cmVzCiAgICAgICAgaW4gdGFza3Mgd2hlbiBleGVj dXRvcnMgYXJlIGJlaW5nIHRvcm4gZG93bi4KCiAgICAgICsgQW4gYXN5bmNocm9ub3VzIFRDUCBl Y2hvIHNlcnZlciBzYW1wbGUuCgogIC0gSW50cm9kdWNlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBp bnRlcnJ1cHRzOiBgW1RocmVhZGVkXUhhbmRsZXJgCiAgICB0cmFpdHMsIGBbVGhyZWFkZWRdUmVn aXN0cmF0aW9uYCB0eXBlcywgYSBgUmV0dXJuYCBlbnVtIChhcyB0aGUKICAgIHJldHVybiB2YWx1 ZSBmcm9tIGhhbmRsZXJzKSBhbmQgZmxhZ3M6CgogICAgICAgIHN0cnVjdCBFeGFtcGxlOwoKICAg ICAgICBpbXBsIGlycTo6SGFuZGxlciBmb3IgRXhhbXBsZSB7CiAgICAgICAgICAgIHR5cGUgRGF0 YSA9IEJveDx1MzI+OwoKICAgICAgICAgICAgZm4gaGFuZGxlX2lycShfZGF0YTogJnUzMikgLT4g aXJxOjpSZXR1cm4gewogICAgICAgICAgICAgICAgaXJxOjpSZXR1cm46Ok5vbmUKICAgICAgICAg ICAgfQogICAgICAgIH0KCiAgICAgICAgZm4gcmVxdWVzdF9pcnEoaXJxOiB1MzIsIGRhdGE6IEJv eDx1MzI+KQogICAgICAgICAgLT4gUmVzdWx0PGlycTo6UmVnaXN0cmF0aW9uPEV4YW1wbGU+PiB7 CiAgICAgICAgICAgIGlycTo6UmVnaXN0cmF0aW9uOjp0cnlfbmV3KAogICAgICAgICAgICAgICAg aXJxLCBkYXRhLCBpcnE6OmZsYWdzOjpTSEFSRUQsCiAgICAgICAgICAgICAgICBmbXQhKCJleGFt cGxlX3tpcnF9IikKICAgICAgICAgICAgKQogICAgICAgIH0KCiAgLSBJbnRyb2R1Y2VkIHRoZSBg I1t2dGFibGVdYCBwcm9jIG1hY3JvIGF0dHJpYnV0ZSB0byBzaW1wbGlmeSBob3cKICAgIGZ1bmN0 aW9uIHBvaW50ZXIgdGFibGVzIGxpa2UgYHN0cnVjdCBmaWxlX29wZXJhdGlvbnNgIGFyZSB1c2Vk CiAgICBieSBSdXN0IGtlcm5lbCBtb2R1bGVzLgoKICAgIFByZXZpb3VzbHksIHVzZXJzIGhhZCB0 byBjYWxsIGEgYGRlY2xhcmVfKl9vcGVyYXRpb25zIWAgbWFjcm8KICAgIHdoaWNoIHJlcXVpcmVk IHBhc3NpbmcgdGhlIGRlZmluZWQgb3BlcmF0aW9uczoKCiAgICAgICAgaW1wbCBmaWxlOjpPcGVy YXRpb25zIGZvciBTb21lRmlsZSB7CiAgICAgICAgICAgIC4uLgogICAgICAgICAgICBkZWNsYXJl X2ZpbGVfb3BlcmF0aW9ucyEocmVhZCwgd3JpdGUsIGlvY3RsLCAuLi4pOwogICAgICAgICAgICAu Li4KICAgICAgICB9CgogICAgSW5zdGVhZCwgbm93IGl0IGlzIG9ubHkgcmVxdWlyZWQgdGhhdCB0 aGV5IGFubm90YXRlIHRoZSBgaW1wbGAKICAgIGJsb2NrIHdpdGggdGhlIGF0dHJpYnV0ZToKCiAg ICAgICAgI1t2dGFibGVdCiAgICAgICAgaW1wbCBmaWxlOjpPcGVyYXRpb25zIGZvciBTb21lRmls ZSB7CiAgICAgICAgICAgIC4uLgogICAgICAgIH0KCiAgICBUaGUgcHJvYyBtYWNybyB3aWxsIGdl bmVyYXRlIGEgYm9vbGVhbiBgSEFTXypgIGFzc29jaWF0ZWQgY29uc3RhbnQKICAgIGZvciBlYWNo IG1ldGhvZCBpbiB0aGUgdHJhaXQsIGluZGljYXRpbmcgaWYgdGhlIGltcGxlbWVudGVyIGhhcwog ICAgb3ZlcnJpZGRlbiBhIG1ldGhvZC4KCiAgLSBBZGRlZCBgdW5zYWZlX2xpc3Q6Okxpc3RgLCBh biBpbnRydXNpdmUgY2lyY3VsYXIgZG91Ymx5LWxpbmtlZAogICAgbGlzdCwgbWVhbnQgdG8gYmUg dXNlZCBhcyB0aGUgYmFzaXMgZm9yIG90aGVyIGxpbmtlZCBsaXN0cy4KCiAgICBJdCBpcyBhbHNv IHVzZWQgaW4gdGhlIHdvcmtxdWV1ZS1iYXNlZCBleGVjdXRvciB0byBrZWVwIHRyYWNrIG9mCiAg ICBhbGwgdGFza3Mgc2luY2UgaXQgaXMgY2hlYXBlciB0aGFuIG90aGVyIG9wdGlvbnMuCgogIC0g SW5pdGlhbCBSQ1Ugc3VwcG9ydDogYSBgR3VhcmRgIHR5cGUgdGhhdCByZXByZXNlbnRzIGV2aWRl bmNlIHRoYXQKICAgIHRoZSBSQ1UgcmVhZCBzaWRlIGxvY2sgaXMgaGVsZCBvbiB0aGUgY3VycmVu dCB0aHJlYWQvQ1BVLgoKICAgIEluIGFkZGl0aW9uLCBgUmV2b2NhYmxlYCBub3cgdXNlcyB0aGlz IG5ldyBhYnN0cmFjdGlvbiBzbyB0aGF0CiAgICB1c2VycyBjYW4gcHJvdmlkZSBldmlkZW5jZSBv ZiB0aGUgUkNVIHJlYWQgc2lkZSBsb2NrIGJlaW5nIGhlbGQKICAgIHdoZW4gYWNjZXNzaW5nIHRo ZSBwcm90ZWN0ZWQgb2JqZWN0LCBlLmcuOgoKICAgICAgICBmbiBhZGRfcGFpcih2YWx1ZTogJlJl dm9jYWJsZTwodTMyLCB1MzIpPikgLT4gT3B0aW9uPHUzMj4gewogICAgICAgICAgICBsZXQgZ3Vh cmQgPSByY3U6OnJlYWRfbG9jaygpOwogICAgICAgICAgICBsZXQgcGFpciA9IHZhbHVlLnRyeV9h Y2Nlc3Nfd2l0aF9ndWFyZCgmZ3VhcmQpPzsKICAgICAgICAgICAgU29tZShwYWlyLjAgKyBwYWly LjEpCiAgICAgICAgfQoKICAtIEFkZGVkIGBTdGF0aWNSZWZgIHdoaWNoIGFsbG93cyB0aGUgY3Jl YXRpb24gb2YgInJlZmVyZW5jZS1jb3VudGVkIgogICAgZ2xvYmFsczsgaS5lLiBhbGxvd3MgdG8g ZGVmaW5lIHN0YXRpYyB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXNlZAogICAgd2hlbiBgUmVmPFQ+ YCBvciBgUmVmQm9ycm93PCdfLCBUPmAgYXJlIGV4cGVjdGVkLgoKICAgIFRoaXMsIGluIHR1cm4s IGFsbG93cyB0byBoYXZlIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBzaGFyZWQKICAgIHJlc291cmNl cyAoZS5nLiBhIGdsb2JhbCB3b3JrcXVldWUpIHdpdGhvdXQgYWxsb2NhdGlvbnMgKHRoZQogICAg c2hhcmVkIG9iamVjdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCkuCgogIC0gQWRkZWQgYFRhc2s6 OnNwYXduKClgIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgYXV0b21hdGljYWxseSBydW4KICAgIGtl cm5lbCB0aHJlYWRzIGVhc2lseSwgZS5nLjoKCiAgICAgICAgZm9yIGkgaW4gMC4uMTAgewogICAg ICAgICAgICBUYXNrOjpzcGF3bihmbXQhKCJ0ZXN0e2l9IiksIHRocmVhZGZuKS51bndyYXAoKTsK ICAgICAgICB9CgogIC0gQWRkZWQgYFRhc2s6Ondha2VfdXAoKWAgbWV0aG9kLgoKICAtIENvbnZl cnRlZCBgVGFza2AgdG8gdXNlIGBBUmVmYCB0byB1bmlmeSB0aGUgdXNhZ2Ugb2YgYWxsCiAgICBy ZWYtY291bnRlZCBDIHN0cnVjdHVyZXMuCgogIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBkZWxheXMv c2xlZXBzIChgZGVsYXlgIG1vZHVsZSkgd2l0aCBhIGJhc2ljCiAgICBgY29hcnNlX3NsZWVwKClg IGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIEMgc2lkZSBgbXNsZWVwKClgIGFuZAogICAgdGFrZXMg YWR2YW50YWdlIG9mIHRoZSBgRHVyYXRpb25gIHN0YW5kYXJkIGxpYnJhcnkgdHlwZToKCiAgICAg ICAgY29hcnNlX3NsZWVwKER1cmF0aW9uOjpmcm9tX21pbGxpcygyMCkpOwoKICAtIEFkZGVkIGZp bGUgZmxhZ3MgKHRvIGZ1cnRoZXIgcmVkdWNlIGBiaW5kaW5nczo6KmAgdXNhZ2UpLCBlLmcuOgoK ICAgICAgICBsZXQgYmxvY2tpbmcgPSAoZmlsZS5mbGFncygpICYgZmlsZTo6ZmxhZ3M6Ok9fTk9O QkxPQ0spID09IDA7CgogIC0gQWRkZWQgYGdwaW9fY2hpcF9yZWdpc3RlciFgIGFuZCBgZ3Bpb19p cnFfY2hpcF9yZWdpc3RlciFgIG1hY3JvcwogICAgd2hpY2ggYXV0b21hdGljYWxseSBkZWZpbmUg dGhlIHJlcXVpcmVkIGxvY2sgY2xhc3Nlcy4KCiAgLSBSZW1vdmFsIG9mIGBiaW5kaW5nczo6bG9j a19jbGFzc19rZXlgIGZyb20gZHJpdmVycy4gVGhpcyBnZXRzIHVzCiAgICBjbG9zZXIgdG8gZXZl bnR1YWxseSBtYWtlIGJpbmRpbmdzIHByaXZhdGUgdG8gdGhlIGBrZXJuZWxgIGNyYXRlLgoKICAt IE1vdmVkIHVzYWdlIG9mIGBNYW51YWxseURyb3BgIHRvIGBNYXliZVVuaW5pdGAgaW4gYFJldm9j YWJsZWAsCiAgICB3aGljaCB3YXMgdW5zb3VuZC4KCiAgLSBPdGhlciBjbGVhbnVwcywgZml4ZXMg YW5kIGltcHJvdmVtZW50cy4KCgojIyBQYXRjaCBzZXJpZXMgdXBkYXRlcwoKVGhlIHBhdGNoIHNl cmllcyBoYXMgYmVlbiByZW9yZ2FuaXplZCBhIGJpdCBzaW5jZSBsYXN0IHRpbWU6CgogIC0gVGhl IGBpbmNsdWRlL2xpbnV4L2AgY2hhbmdlcyBmb3IgdGhlIEMgaGVscGVycyBoYXZlIGJlZW4gbW92 ZWQKICAgIGludG8gdGhlaXIgb3duIHNtYWxsIHBhdGNoZXMsIHdoaWNoIGNhbiBiZSB0YWtlbiBp bmRlcGVuZGVudGx5CiAgICBhcyBwcmVyZXF1aXNpdGUgcGF0Y2hlcyBpZiBuZWVkZWQuCgogIC0g Tm93IHRoYXQgdGhlIGJpbmRpbmdzIGFyZSBpbiB0aGVpciBvd24gYGJpbmRpbmdzYCBjcmF0ZSwK ICAgIHRoZXkgYWxzbyBnZXQgdGhlaXIgb3duIHBhdGNoLgoKICAtIFRoZXJlIGlzIGEgbmV3IHBh dGNoIHRoYXQgYWRkcyB0aGUgYGtlcm5lbC9jb25maWdzL3J1c3QuY29uZmlnYC4KCiAgLSBPbmUg b2YgdGhlIGBrYWxsc3ltc2AgcGF0Y2hlcyBoYXMgYmVlbiBzcGxpdCBpbnRvIHRocmVlIHNtYWxs ZXIKICAgIG9uZXMuCgogIC0gQ2xlYW5lZCB1cCBzb21lICJleGNlZWRzIDEwMCBjb2x1bW5zIiBg Y2hlY2twYXRjaC5wbGAgd2FybmluZ3MuCiAgICBXaXRoIHRoaXMgZmluYWwgY2xlYW51cCwgdGhl IHJlbWFpbmluZyB3YXJuaW5ncyAob2YgYWxsIGtpbmRzKQogICAgYXJlIGVpdGhlciBmYWxzZSBw b3NpdGl2ZXMsIG9yIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgZGl2ZXJnaW5nCiAgICB3aXRo IHVwc3RyZWFtIGBhbGxvY2Agb3Igd291bGQgbWFrZSB0aGluZ3MgbG9vayB3b3JzZS4KCgojIyBQ YXRjaCBzZXJpZXMgc3RhdHVzCgpUaGUgUnVzdCBzdXBwb3J0IGlzIHN0aWxsIHRvIGJlIGNvbnNp ZGVyZWQgZXhwZXJpbWVudGFsLiBIb3dldmVyLApzdXBwb3J0IGlzIGdvb2QgZW5vdWdoIHRoYXQg a2VybmVsIGRldmVsb3BlcnMgY2FuIHN0YXJ0IHdvcmtpbmcgb24gdGhlClJ1c3QgYWJzdHJhY3Rp b25zIGZvciBzdWJzeXN0ZW1zIGFuZCB3cml0ZSBkcml2ZXJzIGFuZCBvdGhlciBtb2R1bGVzLgoK VGhlIGN1cnJlbnQgc2VyaWVzIHdpbGwgYXBwZWFyIGluIHRoZSBuZXh0IGBsaW51eC1uZXh0YCwg YXMgdXN1YWwuClNpbWlsYXJseSwgdGhlIHByZXZpZXcgZG9jcyBmb3IgdGhpcyBzZXJpZXMgY2Fu IGJlIHNlZW4gYXQ6CgogICAgaHR0cHM6Ly9ydXN0LWZvci1saW51eC5naXRodWIuaW8vZG9jcy9r ZXJuZWwvCgpBcyB1c3VhbCwgcGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIHRoZSBs aXZlIGxpc3Qgb2YgdW5zdGFibGUKUnVzdCBmZWF0dXJlcyB3ZSBhcmUgdXNpbmc6CgogICAgaHR0 cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4L2xpbnV4L2lzc3Vlcy8yCgoKIyMgQ29uZmVy ZW5jZXMsIG1lZXRpbmdzIGFuZCBsaWFpc29ucwoKSm9pbiB1cyBpbiBMUEMgMjAyMiAoTGludXgg UGx1bWJlcnMgQ29uZmVyZW5jZSkgZm9yIHRoZSBSdXN0IE1DCihtaWNyb2NvbmZlcmVuY2UpISBU aGUgc2NoZWR1bGUgaXMgYXZhaWxhYmxlIGF0OgoKICAgIGh0dHBzOi8vbHBjLmV2ZW50cy9ldmVu dC8xNi9zZXNzaW9ucy8xNTAvCgpXZSB3aWxsIGJlIHRhbGtpbmcgYWJvdXQgR0NDIFJ1c3QgKHRo ZSBSdXN0IGZyb250ZW5kIGZvciBHQ0MpLApgcnVzdGNfY29kZWdlbl9nY2NgICh0aGUgR0NDIGJh Y2tlbmQgZm9yIGBydXN0Y2ApLCBSdXN0IGZvciBMaW51eCwKdGhlIFJ1c3QgTlZNZSBkcml2ZXIs IHRoZSBpbnRlZ3JhdGlvbiBvZiBSdXN0IHdpdGggdGhlIEtlcm5lbCBUZXN0aW5nClNlcnZpY2Ug YW5kIFJ1c3QgaW4gdGhlIEtlcm5lbCAodmlhIGVCUEYpLgoKSW4gYWRkaXRpb24sIEkgd291bGQg bGlrZSB0byBwZXJzb25hbGx5IHRoYW5rIEdvb2dsZSBhbmQgSVNSRwooSW50ZXJuZXQgU2VjdXJp dHkgUmVzZWFyY2ggR3JvdXApIGZvciBzcG9uc29yaW5nIEthbmdyZWpvcywKdGhlIFJ1c3QgZm9y IExpbnV4IHdvcmtzaG9wOgoKICAgIGh0dHBzOi8va2FuZ3Jlam9zLmNvbQoKRnVydGhlcm1vcmUs IHdlIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIHZlbnVlcyB3ZSB3ZXJlIGludml0ZWQgdG86Cgog IC0gTGludXggRm91bmRhdGlvbiBMaXZlIE1lbnRvcnNoaXAgU2VyaWVzCiAgLSBPcGVuIFNvdXJj ZSBTdW1taXQgTm9ydGggQW1lcmljYQogIC0gSHVhd2VpIEdsb2JhbCBTb2Z0d2FyZSBUZWNobm9s b2d5IFN1bW1pdAoKCiMjIFJlbGF0ZWQgbmV3cwoKVGhlIEdDQyBTdGVlcmluZyBDb21taXR0ZWUg YWNjZXB0ZWQgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgUnVzdApmcm9udGVuZCAoR0NDIFJ1c3Qp LiBJdHMgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiAoZXhwZXJpbWVudGFsLApkaXNhYmxlZCBieSBk ZWZhdWx0KSBzaG91bGQgYXBwZWFyIGluIEdDQyAxMy4gVGhlIGZpcnN0IHJvdW5kIG9mCnBhdGNo ZXMgaGFzIGJlZW4gcG9zdGVkIHRvIHRoZSBnY2MtcGF0Y2hlcyBtYWlsaW5nIGxpc3QuCgpgcnVz dGNfY29kZWdlbl9nY2NgICh0aGUgR0NDIGJhY2tlbmQgZm9yIGBydXN0Y2ApIGhhcyBzZWVuIGVu b3VnaApwcm9ncmVzcyBvbiBTSU1EIHN1cHBvcnQgdG8gY29tcGlsZSBgc3RkYXJjaGAuIEluIGFk ZGl0aW9uLCBtb3JlCnByZXJlcXVpc2l0ZSBwYXRjaGVzIGFyZSBtYWtpbmcgdGhlaXIgd2F5IGlu dG8gR0NDLgoKCiMjIEFja25vd2xlZGdlbWVudHMKClRoZSBzaWduYXR1cmVzIGluIHRoZSBtYWlu IGNvbW1pdHMgY29ycmVzcG9uZCB0byB0aGUgcGVvcGxlIHRoYXQKd3JvdGUgY29kZSB0aGF0IGhh cyBlbmRlZCB1cCBpbiB0aGVtIGF0IHRoZSBwcmVzZW50IHRpbWUuIEZvciBkZXRhaWxzCm9uIGNv bnRyaWJ1dGlvbnMgdG8gY29kZSBhbmQgZGlzY3Vzc2lvbnMsIHBsZWFzZSBzZWUgb3VyIHJlcG9z aXRvcnk6CgogICAgaHR0cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4L2xpbnV4CgpIb3dl dmVyLCB3ZSB3b3VsZCBsaWtlIHRvIGdpdmUgY3JlZGl0IHRvIGV2ZXJ5b25lIHRoYXQgaGFzIGNv bnRyaWJ1dGVkCmluIG9uZSB3YXkgb3IgYW5vdGhlciB0byB0aGUgUnVzdCBmb3IgTGludXggcHJv amVjdC4gU2luY2UgdGhlCnByZXZpb3VzIGNvdmVyIGxldHRlcjoKCiAgLSBOaWNrIERlc2F1bG5p ZXJzLCBKb2UgUGVyY2hlcywgTWFzYWhpcm8gWWFtYWRhIGFuZCBKYXJra28gU2Fra2luZW4KICAg IGZvciB0aGVpciByZXZpZXdzIG9mIHNvbWUgb2YgdGhlIHY3IHBhdGNoZXMuCgogIC0gRGFuaWVs IExhdHlwb3YsIEJyZW5kYW4gSGlnZ2lucyBhbmQgU2h1YWggS2hhbiBmb3IgcGlja2luZyB1cAog ICAgdGhlIEtVbml0IHByZXJlcXVpc2l0ZSBwYXRjaC4KCiAgLSBBcyB1c3VhbCwgQmrDtnJuIFJv eSBCYXJvbiAoYmpvcm4zKSBhbmQgR2FyeSBHdW8gZm9yIGFsbCB0aGUgaW5wdXQKICAgIG9uIFJ1 c3QgY29tcGlsZXIgZGV0YWlscywgcmV2aWV3cyBhbmQgc3VnZ2VzdGlvbnMuCgogIC0gQW5kcmVh cyBIaW5kYm9yZyBmb3Igd29ya2luZyBvbiB0aGUgTlZNZSBkcml2ZXIsIGFzIHdlbGwgYXMKICAg IGFkZGluZyBhdG9taWMgYWxsb2NhdGlvbnMgZm9yIGBCb3hgIGFuZCBhbGxvd2luZyB0byB1c2Ug R0ZQIGZsYWdzCiAgICBmb3IgYEtlcm5lbEFsbG9jYXRvcmAuCgogIC0gTGkgSG9uZ3l1IGZvciB3 b3JraW5nIG9uIGEgdmlydGlvIGFic3RyYWN0aW9uLgoKICAtIEJvcXVuIEZlbmcgZm9yIHdvcmtp bmcgb24gYWRkaW5nIGFuIGFsbG9jIGFsaWdubWVudCB0ZXN0LgoKICAtIEFuZHJlYXMgUmVpbmRs IGZvciB3b3JraW5nIG9uIGFkZGluZyBtaXNzaW5nIGBTQUZFVFlgIGNvbW1lbnRzLgoKICAtIEFu aGFkIFNpbmdoIGZvciB3b3JraW5nIG9uIGFkZGluZyB0aGUgYG5ld193aXRoX2ZsYWdzYCBtZXRo b2QKICAgIHRvIGBQYWdlc2AuCgogIC0gRmlubiBCZWhyZW5zIGZvciB3b3JraW5nIG9uIG1ha2lu ZyBpdCBwb3NzaWJsZSB0byBjb21waWxlCiAgICB0aGUga2VybmVsIG9uIG1hY09TIHdpdGggUnVz dCBlbmFibGVkLgoKICAtIFJvZWwgS2x1aW4gZm9yIHdvcmtpbmcgb24gY29kZSByZWZhY3Rvcmlu Z3MuCgogIC0gV2VpIExpdSBmb3IgdGFraW5nIHRoZSB0aW1lIHRvIGFuc3dlciBxdWVzdGlvbnMg ZnJvbSBuZXdjb21lcnMKICAgIGluIFp1bGlwLgoKICAtIFBoaWxpcCBMaSwgWXVqaWUgTGl1IGV0 IGFsLiBmb3IgY29udGludWluZyB0aGVpciB3b3JrIG9uIGFkZGluZwogICAgUnVzdCBzdXBwb3J0 IHRvIHRoZSBJbnRlbCAwREFZL0xLUCBrZXJuZWwgdGVzdCByb2JvdC4KCiAgLSBQaGlsaXAgSGVy cm9uIGFuZCBBcnRodXIgQ29oZW4gKGFuZCBoaXMgc3VwcG9ydGVycyBPcGVuIFNvdXJjZQogICAg U2VjdXJpdHkgYW5kIEVtYmVjb3NtKSBldCBhbC4gZm9yIHRoZWlyIG9uZ29pbmcgd29yayBvbiBH Q0MgUnVzdC4KCiAgLSBBbnRvbmkgQm91Y2hlciAoYW5kIGhpcyBzdXBwb3J0ZXJzKSBldCBhbC4g Zm9yIHRoZWlyIG9uZ29pbmcKICAgIHdvcmsgb24gYHJ1c3RjX2NvZGVnZW5fZ2NjYC4KCiAgLSBF bWlsaW8gQ29ib3Mgw4FsdmFyZXogZXQuIGFsLiBmb3IgdGhlaXIgd29yayBvbiBgYmluZGdlbmAs CiAgICBpbmNsdWRpbmcgb24gaXNzdWVzIHRoYXQgYWZmZWN0IHRoZSBrZXJuZWwuCgogIC0gTWF0 cyBMYXJzZW4sIE1hcmMgUG91bGhpw6hzIGV0IGFsLiBmb3IgdGhlaXIgb25nb2luZyB3b3JrIG9u CiAgICBpbXByb3ZpbmcgUnVzdCBzdXBwb3J0IGluIENvbXBpbGVyIEV4cGxvcmVyLgoKICAtIE1h bnkgZm9sa3MgdGhhdCBoYXZlIHJlcG9ydGVkIGlzc3VlcywgdGVzdGVkIHRoZSBwcm9qZWN0LAog ICAgaGVscGVkIHNwcmVhZCB0aGUgd29yZCwgam9pbmVkIGRpc2N1c3Npb25zIGFuZCBjb250cmli dXRlZCBpbgogICAgb3RoZXIgd2F5cyEKClBsZWFzZSBzZWUgYWxzbyB0aGUgYWNrbm93bGVkZ2Vt ZW50cyBvbiB0aGUgcHJldmlvdXMgY292ZXIgbGV0dGVycy4KCgpCb3F1biBGZW5nICgyKToKICBr YWxsc3ltczogdXNlIGBzaXplb2ZgIGluc3RlYWQgb2YgaGFyZGNvZGVkIHNpemUKICBrYWxsc3lt czogYXZvaWQgaGFyZGNvZGluZyBidWZmZXIgc2l6ZQoKR2FyeSBHdW8gKDIpOgogIHJ1c3Q6IGFk ZCBgYnVpbGRfZXJyb3JgIGNyYXRlCiAgdnNwcmludGY6IGFkZCBuZXcgYCVwQWAgZm9ybWF0IHNw ZWNpZmllcgoKTWlndWVsIE9qZWRhICgxOSk6CiAga2FsbHN5bXM6IGFkZCBzdGF0aWMgcmVsYXRp b25zaGlwIGJldHdlZW4gYEtTWU1fTkFNRV9MRU57LF9CVUZGRVJ9YAogIGthbGxzeW1zOiBzdXBw b3J0ICJiaWciIGtlcm5lbCBzeW1ib2xzCiAga2FsbHN5bXM6IGluY3JlYXNlIG1heGltdW0ga2Vy bmVsIHN5bWJvbCBsZW5ndGggdG8gNTEyCiAgcnVzdDogYWRkIEMgaGVscGVycwogIHJ1c3Q6IGFk ZCBgY29tcGlsZXJfYnVpbHRpbnNgIGNyYXRlCiAgcnVzdDogaW1wb3J0IHVwc3RyZWFtIGBhbGxv Y2AgY3JhdGUKICBydXN0OiBhZGFwdCBgYWxsb2NgIGNyYXRlIHRvIHRoZSBrZXJuZWwKICBydXN0 OiBhZGQgYG1hY3Jvc2AgY3JhdGUKICBydXN0OiBhZGQgYGJpbmRpbmdzYCBjcmF0ZQogIHJ1c3Q6 IGV4cG9ydCBnZW5lcmF0ZWQgc3ltYm9scwogIHNjcmlwdHM6IGNoZWNrcGF0Y2g6IGRpYWdub3Nl IHVzZXMgb2YgYCVwQWAgaW4gdGhlIEMgc2lkZSBhcyBlcnJvcnMKICBzY3JpcHRzOiBjaGVja3Bh dGNoOiBlbmFibGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgY2hlY2tzIGZvciBSdXN0CiAgc2NyaXB0 czogYWRkIGBydXN0ZG9jX3Rlc3Rfe2J1aWxkZXIsZ2VufS5weWAgc2NyaXB0cwogIHNjcmlwdHM6 IGFkZCBgZ2VuZXJhdGVfcnVzdF9hbmFseXplci5weWAgc2NyaXB0cwogIHNjcmlwdHM6IGRlY29k ZV9zdGFja3RyYWNlOiBkZW1hbmdsZSBSdXN0IHN5bWJvbHMKICBkb2NzOiBhZGQgUnVzdCBkb2N1 bWVudGF0aW9uCiAgS2J1aWxkOiBhZGQgUnVzdCBzdXBwb3J0CiAgc2FtcGxlczogYWRkIFJ1c3Qg ZXhhbXBsZXMKICBNQUlOVEFJTkVSUzogUnVzdAoKV2Vkc29uIEFsbWVpZGEgRmlsaG8gKDgpOgog IHdvcmtxdWV1ZTogaW50cm9kdWNlIGBfX0lOSVRfV09SS19XSVRIX0tFWWAKICBsb2NraW5nL3Nw aW5sb2NrOiBpbnRyb2R1Y2UgYF9fc3Bpbl9sb2NrX2luaXRgCiAgbG9ja2luZy9zcGlubG9jazog aW50cm9kdWNlIGBfcmF3X3NwaW5fbG9ja19pbml0YAogIHJ1c3Q6IGFkZCBga2VybmVsYCBjcmF0 ZSdzIGBzeW5jYCBtb2R1bGUKICBydXN0OiBhZGQgYGtlcm5lbGAgY3JhdGUKICBjb25maWdzOiBh ZGQgYHJ1c3RgIGNvbmZpZwogIFtSRkNdIGRyaXZlcnM6IGdwaW86IFByaW1lQ2VsbCBQTDA2MSBp biBSdXN0CiAgW1JGQ10gZHJpdmVyczogYW5kcm9pZDogQmluZGVyIElQQyBpbiBSdXN0CgogLmdp dGlnbm9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsKIC5ydXN0 Zm10LnRvbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMiArCiBEb2N1bWVu dGF0aW9uL2NvcmUtYXBpL3ByaW50ay1mb3JtYXRzLnJzdCAgICB8ICAgMTAgKwogRG9jdW1lbnRh dGlvbi9kb2MtZ3VpZGUva2VybmVsLWRvYy5yc3QgICAgICAgfCAgICAzICsKIERvY3VtZW50YXRp b24vaW5kZXgucnN0ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBEb2N1bWVudGF0aW9u L2tidWlsZC9rYnVpbGQucnN0ICAgICAgICAgICAgICB8ICAgMTcgKwogRG9jdW1lbnRhdGlvbi9r YnVpbGQvbWFrZWZpbGVzLnJzdCAgICAgICAgICAgfCAgIDUwICstCiBEb2N1bWVudGF0aW9uL3By b2Nlc3MvY2hhbmdlcy5yc3QgICAgICAgICAgICB8ICAgNDEgKwogRG9jdW1lbnRhdGlvbi9ydXN0 L2FyY2gtc3VwcG9ydC5yc3QgICAgICAgICAgfCAgIDIzICsKIERvY3VtZW50YXRpb24vcnVzdC9j b2RpbmctZ3VpZGVsaW5lcy5yc3QgICAgIHwgIDIxNiArKwogRG9jdW1lbnRhdGlvbi9ydXN0L2dl bmVyYWwtaW5mb3JtYXRpb24ucnN0ICAgfCAgIDc5ICsKIERvY3VtZW50YXRpb24vcnVzdC9pbmRl eC5yc3QgICAgICAgICAgICAgICAgIHwgICAyMiArCiBEb2N1bWVudGF0aW9uL3J1c3QvcXVpY2st c3RhcnQucnN0ICAgICAgICAgICB8ICAyMzIgKysKIE1BSU5UQUlORVJTICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAxNSArCiBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAxNzIgKy0KIGFyY2gvS2NvbmZpZyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgNiArCiBhcmNoL2FybS9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgKwogYXJjaC9hcm02NC9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAxICsKIGFyY2gvcG93ZXJwYy9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgMSArCiBhcmNoL3Jpc2N2L0tjb25maWcgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgIDEgKwogYXJjaC9yaXNjdi9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICA1ICsKIGFyY2gvdW0vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMSArCiBhcmNoL3g4Ni9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgIDEgKwogYXJjaC94ODYvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEwICsKIGRyaXZlcnMvYW5kcm9pZC9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNiArCiBkcml2ZXJzL2FuZHJvaWQvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICB8ICAg IDIgKwogZHJpdmVycy9hbmRyb2lkL2FsbG9jYXRpb24ucnMgICAgICAgICAgICAgICAgfCAgMjY2 ICsrCiBkcml2ZXJzL2FuZHJvaWQvY29udGV4dC5ycyAgICAgICAgICAgICAgICAgICB8ICAgODAg KwogZHJpdmVycy9hbmRyb2lkL2RlZnMucnMgICAgICAgICAgICAgICAgICAgICAgfCAgIDk5ICsK IGRyaXZlcnMvYW5kcm9pZC9ub2RlLnJzICAgICAgICAgICAgICAgICAgICAgIHwgIDQ3NiArKysK IGRyaXZlcnMvYW5kcm9pZC9wcm9jZXNzLnJzICAgICAgICAgICAgICAgICAgIHwgIDk2MSArKysr KwogZHJpdmVycy9hbmRyb2lkL3JhbmdlX2FsbG9jLnJzICAgICAgICAgICAgICAgfCAgMTg5ICsK IGRyaXZlcnMvYW5kcm9pZC9ydXN0X2JpbmRlci5ycyAgICAgICAgICAgICAgIHwgIDEwNiArCiBk cml2ZXJzL2FuZHJvaWQvdGhyZWFkLnJzICAgICAgICAgICAgICAgICAgICB8ICA4NzEgKysrKysK IGRyaXZlcnMvYW5kcm9pZC90cmFuc2FjdGlvbi5ycyAgICAgICAgICAgICAgIHwgIDMyNiArKwog ZHJpdmVycy9ncGlvL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4ICsKIGRy aXZlcnMvZ3Bpby9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBkcml2 ZXJzL2dwaW8vZ3Bpb19wbDA2MV9ydXN0LnJzICAgICAgICAgICAgICB8ICAzNjcgKysKIGluY2x1 ZGUvbGludXgvY29tcGlsZXJfdHlwZXMuaCAgICAgICAgICAgICAgIHwgICAgNiArLQogaW5jbHVk ZS9saW51eC9rYWxsc3ltcy5oICAgICAgICAgICAgICAgICAgICAgfCAgICAyICstCiBpbmNsdWRl L2xpbnV4L3NwaW5sb2NrLmggICAgICAgICAgICAgICAgICAgICB8ICAgMTcgKy0KIGluY2x1ZGUv bGludXgvd29ya3F1ZXVlLmggICAgICAgICAgICAgICAgICAgIHwgICAyMSArLQogaW5jbHVkZS91 YXBpL2xpbnV4L2FuZHJvaWQvYmluZGVyLmggICAgICAgICAgfCAgIDMwICstCiBpbml0L0tjb25m aWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDYgKy0KIGtlcm5lbC9jb25m aWdzL3J1c3QuY29uZmlnICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBrZXJuZWwva2FsbHN5 bXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjYgKy0KIGtlcm5lbC9saXZlcGF0 Y2gvY29yZS5jICAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArLQogbGliL0tjb25maWcuZGVi dWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDgyICsKIGxpYi92c3ByaW50Zi5jICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMyArCiBydXN0Ly5naXRpZ25vcmUgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTAgKwogcnVzdC9NYWtlZmlsZSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDE1ICsrKwogcnVzdC9hbGxvYy9SRUFETUUubWQg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMzICsKIHJ1c3QvYWxsb2MvYWxsb2MucnMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDQ0MCArKysKIHJ1c3QvYWxsb2MvYm9ycm93LnJzICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDQ5OCArKysKIHJ1c3QvYWxsb2MvYm94ZWQucnMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMjAyNiArKysrKysrKysrKwogcnVzdC9hbGxvYy9ib3hl ZC90aGluLnJzICAgICAgICAgICAgICAgICAgICAgfCAgMjE5ICsrCiBydXN0L2FsbG9jL2NvbGxl Y3Rpb25zL21vZC5ycyAgICAgICAgICAgICAgICB8ICAxNTYgKwogcnVzdC9hbGxvYy9mZmkvY19z dHIucnMgICAgICAgICAgICAgICAgICAgICAgfCAxMjAzICsrKysrKwogcnVzdC9hbGxvYy9mZmkv bW9kLnJzICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDkzICsKIHJ1c3QvYWxsb2MvZm10LnJz ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYxNCArKysrCiBydXN0L2FsbG9jL2xpYi5y cyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyMzkgKysKIHJ1c3QvYWxsb2MvbWFjcm9z LnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyOCArCiBydXN0L2FsbG9jL3Jhd192ZWMu cnMgICAgICAgICAgICAgICAgICAgICAgICB8ICA1NjcgKysrCiBydXN0L2FsbG9jL3NsaWNlLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyOTUgKysrKysrKwogcnVzdC9hbGxvYy9zdHIu cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQxICsrKysKIHJ1c3QvYWxsb2Mvc3Ry aW5nLnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjk0NCArKysrKysrKysrKysrKysKIHJ1 c3QvYWxsb2MvdmVjL2RyYWluLnJzICAgICAgICAgICAgICAgICAgICAgIHwgIDE4NiArCiBydXN0 L2FsbG9jL3ZlYy9kcmFpbl9maWx0ZXIucnMgICAgICAgICAgICAgICB8ICAxNDUgKwogcnVzdC9h bGxvYy92ZWMvaW50b19pdGVyLnJzICAgICAgICAgICAgICAgICAgfCAgMzY1ICsrCiBydXN0L2Fs bG9jL3ZlYy9pc196ZXJvLnJzICAgICAgICAgICAgICAgICAgICB8ICAxMjAgKwogcnVzdC9hbGxv Yy92ZWMvbW9kLnJzICAgICAgICAgICAgICAgICAgICAgICAgfCAzNDIwICsrKysrKysrKysrKysr KysrKwogcnVzdC9hbGxvYy92ZWMvcGFydGlhbF9lcS5ycyAgICAgICAgICAgICAgICAgfCAgIDQ5 ICsKIHJ1c3QvYWxsb2MvdmVjL3NldF9sZW5fb25fZHJvcC5ycyAgICAgICAgICAgIHwgICAzMCAr CiBydXN0L2FsbG9jL3ZlYy9zcGVjX2V4dGVuZC5ycyAgICAgICAgICAgICAgICB8ICAxNzQgKwog cnVzdC9iaW5kZ2VuX3BhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxICsKIHJ1 c3QvYmluZGluZ3MvYmluZGluZ3NfaGVscGVyLmggICAgICAgICAgICAgIHwgICA0OSArCiBydXN0 L2JpbmRpbmdzL2xpYi5ycyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTcgKwogcnVzdC9i dWlsZF9lcnJvci5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI5ICsKIHJ1c3QvY29t cGlsZXJfYnVpbHRpbnMucnMgICAgICAgICAgICAgICAgICAgIHwgICA3OSArCiBydXN0L2V4cG9y dHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjEgKwogcnVzdC9oZWxwZXJz LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjc5ICsrKysKIHJ1c3Qva2VybmVs L2FsbG9jYXRvci5ycyAgICAgICAgICAgICAgICAgICAgIHwgICA2NCArCiBydXN0L2tlcm5lbC9h bWJhLnJzICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyNjEgKysKIHJ1c3Qva2VybmVsL2J1 aWxkX2Fzc2VydC5ycyAgICAgICAgICAgICAgICAgIHwgICA4MyArCiBydXN0L2tlcm5lbC9jaHJk ZXYucnMgICAgICAgICAgICAgICAgICAgICAgICB8ICAyMDYgKysKIHJ1c3Qva2VybmVsL2Nsay5y cyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3OSArCiBydXN0L2tlcm5lbC9jcmVkLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDYgKwogcnVzdC9rZXJuZWwvZGVsYXkucnMg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTA0ICsKIHJ1c3Qva2VybmVsL2RldmljZS5ycyAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDUyNyArKysKIHJ1c3Qva2VybmVsL2RyaXZlci5ycyAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDQ0MiArKysKIHJ1c3Qva2VybmVsL2Vycm9yLnJzICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDU2NCArKysKIHJ1c3Qva2VybmVsL2ZpbGUucnMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDg4NyArKysrKwogcnVzdC9rZXJuZWwvZnMucnMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ2ICsrKysrCiBydXN0L2tlcm5lbC9mcy9wYXJh bS5ycyAgICAgICAgICAgICAgICAgICAgICB8ICA1NTMgKysrCiBydXN0L2tlcm5lbC9ncGlvLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MDUgKysrCiBydXN0L2tlcm5lbC9od3JuZy5y cyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyMTAgKysKIHJ1c3Qva2VybmVsL2lvX2J1ZmZl ci5ycyAgICAgICAgICAgICAgICAgICAgIHwgIDE1MyArCiBydXN0L2tlcm5lbC9pb19tZW0ucnMg ICAgICAgICAgICAgICAgICAgICAgICB8ICAyNzggKysKIHJ1c3Qva2VybmVsL2lvdl9pdGVyLnJz ICAgICAgICAgICAgICAgICAgICAgIHwgICA4MSArCiBydXN0L2tlcm5lbC9pcnEucnMgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICA2ODEgKysrKwogcnVzdC9rZXJuZWwva2FzeW5jLnJzICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIDUwICsKIHJ1c3Qva2VybmVsL2thc3luYy9leGVjdXRv ci5ycyAgICAgICAgICAgICAgIHwgIDE1NCArCiBydXN0L2tlcm5lbC9rYXN5bmMvZXhlY3V0b3Iv d29ya3F1ZXVlLnJzICAgICB8ICAyOTEgKysKIHJ1c3Qva2VybmVsL2thc3luYy9uZXQucnMgICAg ICAgICAgICAgICAgICAgIHwgIDMyMiArKwogcnVzdC9rZXJuZWwva3VuaXQucnMgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDkxICsKIHJ1c3Qva2VybmVsL2xpYi5ycyAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgIDI2NyArKwogcnVzdC9rZXJuZWwvbGlua2VkX2xpc3QucnMgICAgICAg ICAgICAgICAgICAgfCAgMjQ3ICsrCiBydXN0L2tlcm5lbC9taXNjZGV2LnJzICAgICAgICAgICAg ICAgICAgICAgICB8ICAyOTAgKysKIHJ1c3Qva2VybmVsL21tLnJzICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDE0OSArCiBydXN0L2tlcm5lbC9tb2R1bGVfcGFyYW0ucnMgICAgICAgICAg ICAgICAgICB8ICA0OTkgKysrCiBydXN0L2tlcm5lbC9uZXQucnMgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAzOTIgKysKIHJ1c3Qva2VybmVsL25ldC9maWx0ZXIucnMgICAgICAgICAgICAg ICAgICAgIHwgIDQ0NyArKysKIHJ1c3Qva2VybmVsL29mLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA2MyArCiBydXN0L2tlcm5lbC9wYWdlcy5ycyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAxNDQgKwogcnVzdC9rZXJuZWwvcGxhdGZvcm0ucnMgICAgICAgICAgICAgICAgICAg ICAgfCAgMjIzICsrCiBydXN0L2tlcm5lbC9wb3dlci5ycyAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAxMTggKwogcnVzdC9rZXJuZWwvcHJlbHVkZS5ycyAgICAgICAgICAgICAgICAgICAgICAg fCAgIDM2ICsKIHJ1c3Qva2VybmVsL3ByaW50LnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwg IDQwNiArKysKIHJ1c3Qva2VybmVsL3JhbmRvbS5ycyAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0MiArCiBydXN0L2tlcm5lbC9yYXdfbGlzdC5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAz NjEgKysKIHJ1c3Qva2VybmVsL3JidHJlZS5ycyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDU2 MyArKysKIHJ1c3Qva2VybmVsL3Jldm9jYWJsZS5ycyAgICAgICAgICAgICAgICAgICAgIHwgIDQy NSArKysKIHJ1c3Qva2VybmVsL3NlY3VyaXR5LnJzICAgICAgICAgICAgICAgICAgICAgIHwgICAz OCArCiBydXN0L2tlcm5lbC9zdGF0aWNfYXNzZXJ0LnJzICAgICAgICAgICAgICAgICB8ICAgMzQg KwogcnVzdC9rZXJuZWwvc3RkX3ZlbmRvci5ycyAgICAgICAgICAgICAgICAgICAgfCAgMTYxICsK IHJ1c3Qva2VybmVsL3N0ci5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDU5NyArKysK IHJ1c3Qva2VybmVsL3N5bmMucnMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE2OSArCiBy dXN0L2tlcm5lbC9zeW5jL2FyYy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICA1ODIgKysrCiBy dXN0L2tlcm5lbC9zeW5jL2NvbmR2YXIucnMgICAgICAgICAgICAgICAgICB8ICAxNDAgKwogcnVz dC9rZXJuZWwvc3luYy9ndWFyZC5ycyAgICAgICAgICAgICAgICAgICAgfCAgMTU5ICsKIHJ1c3Qv a2VybmVsL3N5bmMvbG9ja2VkX2J5LnJzICAgICAgICAgICAgICAgIHwgIDExMSArCiBydXN0L2tl cm5lbC9zeW5jL211dGV4LnJzICAgICAgICAgICAgICAgICAgICB8ICAxNDkgKwogcnVzdC9rZXJu ZWwvc3luYy9ub3dhaXQucnMgICAgICAgICAgICAgICAgICAgfCAgMTg4ICsKIHJ1c3Qva2VybmVs L3N5bmMvcmN1LnJzICAgICAgICAgICAgICAgICAgICAgIHwgICA1MiArCiBydXN0L2tlcm5lbC9z eW5jL3Jldm9jYWJsZS5ycyAgICAgICAgICAgICAgICB8ICAyNDYgKysKIHJ1c3Qva2VybmVsL3N5 bmMvcndzZW0ucnMgICAgICAgICAgICAgICAgICAgIHwgIDE5NiArCiBydXN0L2tlcm5lbC9zeW5j L3NlcWxvY2sucnMgICAgICAgICAgICAgICAgICB8ICAyMDEgKwogcnVzdC9rZXJuZWwvc3luYy9z bXV0ZXgucnMgICAgICAgICAgICAgICAgICAgfCAgMjkwICsrCiBydXN0L2tlcm5lbC9zeW5jL3Nw aW5sb2NrLnJzICAgICAgICAgICAgICAgICB8ICAzNTcgKysKIHJ1c3Qva2VybmVsL3N5c2N0bC5y cyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE5OSArCiBydXN0L2tlcm5lbC90YXNrLnJzICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAyMzkgKysKIHJ1c3Qva2VybmVsL3R5cGVzLnJzICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDcwNSArKysrCiBydXN0L2tlcm5lbC91bnNhZmVfbGlz dC5ycyAgICAgICAgICAgICAgICAgICB8ICA2ODAgKysrKwogcnVzdC9rZXJuZWwvdXNlcl9wdHIu cnMgICAgICAgICAgICAgICAgICAgICAgfCAgMTc1ICsKIHJ1c3Qva2VybmVsL3dvcmtxdWV1ZS5y cyAgICAgICAgICAgICAgICAgICAgIHwgIDUxMiArKysKIHJ1c3QvbWFjcm9zL2NvbmNhdF9pZGVu dHMucnMgICAgICAgICAgICAgICAgIHwgICAyMyArCiBydXN0L21hY3Jvcy9oZWxwZXJzLnJzICAg ICAgICAgICAgICAgICAgICAgICB8ICAgNzkgKwogcnVzdC9tYWNyb3MvbGliLnJzICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgMTkxICsKIHJ1c3QvbWFjcm9zL21vZHVsZS5ycyAgICAgICAg ICAgICAgICAgICAgICAgIHwgIDY1NSArKysrCiBydXN0L21hY3Jvcy92dGFibGUucnMgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgOTUgKwogc2FtcGxlcy9LY29uZmlnICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAyICsKIHNhbXBsZXMvTWFrZWZpbGUgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMSArCiBzYW1wbGVzL3J1c3QvS2NvbmZpZyAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAxNjUgKwogc2FtcGxlcy9ydXN0L01ha2VmaWxlICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDE5ICsKIHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvLmdpdGlnbm9yZSAgICAg ICAgICAgIHwgICAgMyArCiBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL01ha2VmaWxlICAgICAgICAg ICAgICB8ICAgIDUgKwogc2FtcGxlcy9ydXN0L2hvc3Rwcm9ncy9hLnJzICAgICAgICAgICAgICAg ICAgfCAgICA3ICsKIHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvYi5ycyAgICAgICAgICAgICAgICAg IHwgICAgNSArCiBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL3NpbmdsZS5ycyAgICAgICAgICAgICB8 ICAgMTIgKwogc2FtcGxlcy9ydXN0L3J1c3RfY2hyZGV2LnJzICAgICAgICAgICAgICAgICAgfCAg IDQ5ICsKIHNhbXBsZXMvcnVzdC9ydXN0X2VjaG9fc2VydmVyLnJzICAgICAgICAgICAgIHwgICA2 MCArCiBzYW1wbGVzL3J1c3QvcnVzdF9mcy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAgNTkg Kwogc2FtcGxlcy9ydXN0L3J1c3RfbWluaW1hbC5ycyAgICAgICAgICAgICAgICAgfCAgIDM1ICsK IHNhbXBsZXMvcnVzdC9ydXN0X21pc2NkZXYucnMgICAgICAgICAgICAgICAgIHwgIDE0MiArCiBz YW1wbGVzL3J1c3QvcnVzdF9tb2R1bGVfcGFyYW1ldGVycy5ycyAgICAgICB8ICAgNjkgKwogc2Ft cGxlcy9ydXN0L3J1c3RfbmV0ZmlsdGVyLnJzICAgICAgICAgICAgICAgfCAgIDU0ICsKIHNhbXBs ZXMvcnVzdC9ydXN0X3BsYXRmb3JtLnJzICAgICAgICAgICAgICAgIHwgICAyMiArCiBzYW1wbGVz L3J1c3QvcnVzdF9wcmludC5ycyAgICAgICAgICAgICAgICAgICB8ICAgNTQgKwogc2FtcGxlcy9y dXN0L3J1c3RfcmFuZG9tLnJzICAgICAgICAgICAgICAgICAgfCAgIDYwICsKIHNhbXBsZXMvcnVz dC9ydXN0X3NlbGZ0ZXN0cy5ycyAgICAgICAgICAgICAgIHwgICA5OSArCiBzYW1wbGVzL3J1c3Qv cnVzdF9zZW1hcGhvcmUucnMgICAgICAgICAgICAgICB8ICAxNzAgKwogc2FtcGxlcy9ydXN0L3J1 c3Rfc2VtYXBob3JlX2MuYyAgICAgICAgICAgICAgfCAgMjEyICsrCiBzYW1wbGVzL3J1c3QvcnVz dF9zdGFja19wcm9iaW5nLnJzICAgICAgICAgICB8ICAgMzYgKwogc2FtcGxlcy9ydXN0L3J1c3Rf c3luYy5ycyAgICAgICAgICAgICAgICAgICAgfCAgIDkzICsKIHNjcmlwdHMvLmdpdGlnbm9yZSAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBzY3JpcHRzL0tjb25maWcuaW5jbHVk ZSAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKy0KIHNjcmlwdHMvTWFrZWZpbGUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgMyArCiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkICAg ICAgICAgICAgICAgICAgICAgICB8ICAgNjAgKwogc2NyaXB0cy9NYWtlZmlsZS5kZWJ1ZyAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDEwICsKIHNjcmlwdHMvTWFrZWZpbGUuaG9zdCAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAzNCArLQogc2NyaXB0cy9NYWtlZmlsZS5saWIgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDEyICsKIHNjcmlwdHMvTWFrZWZpbGUubW9kZmluYWwgICAgICAg ICAgICAgICAgICAgIHwgICAgOCArLQogc2NyaXB0cy9jYy12ZXJzaW9uLnNoICAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDEyICstCiBzY3JpcHRzL2NoZWNrcGF0Y2gucGwgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMTIgKy0KIHNjcmlwdHMvZGVjb2RlX3N0YWNrdHJhY2Uuc2ggICAgICAg ICAgICAgICAgIHwgICAxNCArCiBzY3JpcHRzL2dlbmVyYXRlX3J1c3RfYW5hbHl6ZXIucHkgICAg ICAgICAgICB8ICAxNDEgKwogc2NyaXB0cy9nZW5lcmF0ZV9ydXN0X3RhcmdldC5ycyAgICAgICAg ICAgICAgfCAgMjMyICsrCiBzY3JpcHRzL2lzX3J1c3RfbW9kdWxlLnNoICAgICAgICAgICAgICAg ICAgICB8ICAgMTYgKwogc2NyaXB0cy9rYWxsc3ltcy5jICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgIDQ3ICstCiBzY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyAgICAgICAgICAgICAgICAg ICB8ICAgNzUgKwogc2NyaXB0cy9taW4tdG9vbC12ZXJzaW9uLnNoICAgICAgICAgICAgICAgICAg fCAgICA2ICsKIHNjcmlwdHMvcnVzdC1pcy1hdmFpbGFibGUtYmluZGdlbi1saWJjbGFuZy5oIHwg ICAgMiArCiBzY3JpcHRzL3J1c3QtaXMtYXZhaWxhYmxlLnNoICAgICAgICAgICAgICAgICB8ICAx NjAgKwogc2NyaXB0cy9ydXN0ZG9jX3Rlc3RfYnVpbGRlci5weSAgICAgICAgICAgICAgfCAgIDU5 ICsKIHNjcmlwdHMvcnVzdGRvY190ZXN0X2dlbi5weSAgICAgICAgICAgICAgICAgIHwgIDE2NCAr CiB0b29scy9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmggICAgICAgICAgICAgICB8ICAgIDIgKy0K IHRvb2xzL2xpYi9wZXJmL2luY2x1ZGUvcGVyZi9ldmVudC5oICAgICAgICAgIHwgICAgMiArLQog dG9vbHMvbGliL3N5bWJvbC9rYWxsc3ltcy5oICAgICAgICAgICAgICAgICAgfCAgICAyICstCiAx OTggZmlsZXMgY2hhbmdlZCwgNDM2ODggaW5zZXJ0aW9ucygrKSwgNzUgZGVsZXRpb25zKC0pCiBj cmVhdGUgbW9kZSAxMDA2NDQgLnJ1c3RmbXQudG9tbAogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3Vt ZW50YXRpb24vcnVzdC9hcmNoLXN1cHBvcnQucnN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1l bnRhdGlvbi9ydXN0L2NvZGluZy1ndWlkZWxpbmVzLnJzdAogY3JlYXRlIG1vZGUgMTAwNjQ0IERv Y3VtZW50YXRpb24vcnVzdC9nZW5lcmFsLWluZm9ybWF0aW9uLnJzdAogY3JlYXRlIG1vZGUgMTAw NjQ0IERvY3VtZW50YXRpb24vcnVzdC9pbmRleC5yc3QKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1 bWVudGF0aW9uL3J1c3QvcXVpY2stc3RhcnQucnN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9hbmRyb2lkL2FsbG9jYXRpb24ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJv aWQvY29udGV4dC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5kcm9pZC9kZWZzLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9hbmRyb2lkL25vZGUucnMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvcHJvY2Vzcy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvYW5kcm9pZC9yYW5nZV9hbGxvYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv YW5kcm9pZC9ydXN0X2JpbmRlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5kcm9p ZC90aHJlYWQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvdHJhbnNhY3Rp b24ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwaW8vZ3Bpb19wbDA2MV9ydXN0LnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQga2VybmVsL2NvbmZpZ3MvcnVzdC5jb25maWcKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0Ly5naXRpZ25vcmUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L01ha2Vm aWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy9SRUFETUUubWQKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBydXN0L2FsbG9jL2FsbG9jLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxv Yy9ib3Jyb3cucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL2JveGVkLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy9ib3hlZC90aGluLnJzCiBjcmVhdGUgbW9kZSAxMDA2 NDQgcnVzdC9hbGxvYy9jb2xsZWN0aW9ucy9tb2QucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2FsbG9jL2ZmaS9jX3N0ci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvZmZpL21v ZC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvZm10LnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9hbGxvYy9saWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL21h Y3Jvcy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvcmF3X3ZlYy5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mvc2xpY2UucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2FsbG9jL3N0ci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mvc3RyaW5nLnJzCiBj cmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvZHJhaW4ucnMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBydXN0L2FsbG9jL3ZlYy9kcmFpbl9maWx0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2FsbG9jL3ZlYy9pbnRvX2l0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9j L3ZlYy9pc196ZXJvLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvbW9kLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvcGFydGlhbF9lcS5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvdmVjL3NldF9sZW5fb25fZHJvcC5ycwogY3JlYXRlIG1v ZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvdmVjL3NwZWNfZXh0ZW5kLnJzCiBjcmVhdGUgbW9kZSAxMDA2 NDQgcnVzdC9iaW5kZ2VuX3BhcmFtZXRlcnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2JpbmRp bmdzL2JpbmRpbmdzX2hlbHBlci5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9iaW5kaW5ncy9s aWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2J1aWxkX2Vycm9yLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9jb21waWxlcl9idWlsdGlucy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3QvZXhwb3J0cy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9oZWxwZXJzLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9hbGxvY2F0b3IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9hbWJhLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvYnVpbGRf YXNzZXJ0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvY2hyZGV2LnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvY2xrLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9rZXJuZWwvY3JlZC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2RlbGF5LnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvZGV2aWNlLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvZHJpdmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJu ZWwvZXJyb3IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9maWxlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvZnMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2tlcm5lbC9mcy9wYXJhbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2dwaW8u cnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9od3JuZy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3Qva2VybmVsL2lvX2J1ZmZlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qv a2VybmVsL2lvX21lbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2lvdl9pdGVy LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvaXJxLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwva2FzeW5jLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJu ZWwva2FzeW5jL2V4ZWN1dG9yLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwva2Fz eW5jL2V4ZWN1dG9yL3dvcmtxdWV1ZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVs L2thc3luYy9uZXQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9rdW5pdC5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2xpYi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0 IHJ1c3Qva2VybmVsL2xpbmtlZF9saXN0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJu ZWwvbWlzY2Rldi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL21tLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvbW9kdWxlX3BhcmFtLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvbmV0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwv bmV0L2ZpbHRlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL29mLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcGFnZXMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9wbGF0Zm9ybS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3Bv d2VyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcHJlbHVkZS5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3ByaW50LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9rZXJuZWwvcmFuZG9tLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcmF3X2xp c3QucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9yYnRyZWUucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9yZXZvY2FibGUucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9zZWN1cml0eS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N0 YXRpY19hc3NlcnQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zdGRfdmVuZG9y LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3RyLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvc3luYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVs L3N5bmMvYXJjLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3luYy9jb25kdmFy LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3luYy9ndWFyZC5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvbG9ja2VkX2J5LnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgcnVzdC9rZXJuZWwvc3luYy9tdXRleC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qv a2VybmVsL3N5bmMvbm93YWl0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3lu Yy9yY3UucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL3Jldm9jYWJsZS5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvcndzZW0ucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL3NlcWxvY2sucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydXN0L2tlcm5lbC9zeW5jL3NtdXRleC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2Vy bmVsL3N5bmMvc3BpbmxvY2sucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeXNj dGwucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC90YXNrLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9rZXJuZWwvdHlwZXMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tl cm5lbC91bnNhZmVfbGlzdC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3VzZXJf cHRyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvd29ya3F1ZXVlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9tYWNyb3MvY29uY2F0X2lkZW50cy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3QvbWFjcm9zL2hlbHBlcnMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L21h Y3Jvcy9saWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L21hY3Jvcy9tb2R1bGUucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBydXN0L21hY3Jvcy92dGFibGUucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzYW1wbGVzL3J1c3QvS2NvbmZpZwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9N YWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvLmdpdGln bm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvTWFrZWZpbGUK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL2EucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL2IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL3NpbmdsZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNh bXBsZXMvcnVzdC9ydXN0X2NocmRldi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVz dC9ydXN0X2VjaG9fc2VydmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1 c3RfZnMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9taW5pbWFsLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfbWlzY2Rldi5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0X21vZHVsZV9wYXJhbWV0ZXJzLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfbmV0ZmlsdGVyLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfcGxhdGZvcm0ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzYW1wbGVzL3J1c3QvcnVzdF9wcmludC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMv cnVzdC9ydXN0X3JhbmRvbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0 X3NlbGZ0ZXN0cy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0X3NlbWFw aG9yZS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ydXN0X3NlbWFwaG9yZV9j LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9zdGFja19wcm9iaW5nLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3Rfc3luYy5ycwogY3JlYXRlIG1v ZGUgMTAwNzU1IHNjcmlwdHMvZ2VuZXJhdGVfcnVzdF9hbmFseXplci5weQogY3JlYXRlIG1vZGUg MTAwNjQ0IHNjcmlwdHMvZ2VuZXJhdGVfcnVzdF90YXJnZXQucnMKIGNyZWF0ZSBtb2RlIDEwMDc1 NSBzY3JpcHRzL2lzX3J1c3RfbW9kdWxlLnNoCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2NyaXB0cy9y dXN0LWlzLWF2YWlsYWJsZS1iaW5kZ2VuLWxpYmNsYW5nLmgKIGNyZWF0ZSBtb2RlIDEwMDc1NSBz Y3JpcHRzL3J1c3QtaXMtYXZhaWxhYmxlLnNoCiBjcmVhdGUgbW9kZSAxMDA3NTUgc2NyaXB0cy9y dXN0ZG9jX3Rlc3RfYnVpbGRlci5weQogY3JlYXRlIG1vZGUgMTAwNzU1IHNjcmlwdHMvcnVzdGRv Y190ZXN0X2dlbi5weQoKCmJhc2UtY29tbWl0OiAzZDdjYjZiMDRjM2YzMTE1NzE5MjM1Y2M2ODY2 YjEwMzI2ZGUzNGNkCi0tIAoyLjM3LjEKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==