From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: BTuin Newsgroups: gmane.emacs.devel Subject: [PROPOSAL] Builder, a build system integration for Emacs Date: Sun, 21 May 2023 12:21:52 +0200 Message-ID: <95980ffc-86e7-ad54-4a20-539d8c6ea5d0@mailo.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------PVNIFZb1DJRbCkTqrRVUEHyN" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29929"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun May 21 12:45:53 2023 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q0gZV-0007bI-B3 for ged-emacs-devel@m.gmane-mx.org; Sun, 21 May 2023 12:45:53 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1q0gYe-00012l-Kk; Sun, 21 May 2023 06:45:00 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1q0gCR-00042y-1t for emacs-devel@gnu.org; Sun, 21 May 2023 06:22:03 -0400 Original-Received: from msg-1.mailo.com ([213.182.54.11]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1q0gCL-0002nG-8P for emacs-devel@gnu.org; Sun, 21 May 2023 06:22:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1684664512; bh=+6inzTijOhvE5Eateh80Jc8qcIvEVsOmUJxQ5/j1wEY=; h=X-EA-Auth:Content-Type:Message-ID:Date:MIME-Version:To:From: Subject; b=bqMtygcBLBzyiGdHJnzrwE1VoSC1CItDs6RBwuJ0MGWEhg0DrixlxKPUORMGCgArx /uI/dEnxohCmAp6acrw+5FPbN3pW4epQQxdlKIDnJ0JmWoEC01skzpHVWuwHaKUZIM rTemwutFlA7xT3hj+/3S1igTabTjjldQnSt2Xye4= Original-Received: by b221-5.in.mailobj.net [192.168.90.25] with ESMTP via ip-20.mailobj.net [213.182.54.20] Sun, 21 May 2023 12:21:52 +0200 (CEST) X-EA-Auth: 4buKZ7GLvQ6GUnK1SAIyFuqr60aRXVZp0wgp/lrXjxqA+xgazQ3awf7L7IaTq4J+ZPMWsibAw+NoPWyvNpn2Ozgr1Hap+26P Content-Language: en-US Received-SPF: pass client-ip=213.182.54.11; envelope-from=btuin@mailo.com; helo=msg-1.mailo.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_FILL_THIS_FORM_SHORT=0.01, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Sun, 21 May 2023 06:44:59 -0400 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:306248 Archived-At: This is a multi-part message in MIME format. --------------PVNIFZb1DJRbCkTqrRVUEHyN Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Table of Contents ───────────────── 1. The problem it tries to solve 2. How it works .. 1. Build system detection .. 2. Configure and compile .. 3. Project only or not? .. 4. Command formatting .. 5. `function-modification' .. 6. Configuration 3. Open questions .. 1. Local configuration .. 2. Build directory name .. 3. Build system detection .. 4. Tramp support .. 5. Flexibility .. 6. Adding a build system .. 7. Other 4. Conclusion Hello, I would like to propose a new package to integrate in Emacs, "Builder". It provides integration with build systems, to ease the configuration and the compilation process, by automatically detecting the build system and proposing relevant commands. Big disclaimer: I do not know many build systems, I do not have a lot of experience in programming, I do not know (E)lisp very well, and English is not my first language. Now that you are definitely sold on it, let's have a deeper explanation! As far as I know, Emacs does not provide a convenient way to use build systems, like CMake, Meson, Autotools, Cargo, Dune, and so on. I know your can configure the compilation command with local variables, but: • You cannot have a choice, like `cmake .. -DCMAKE_BUILD_TYPE=Release' or `cmake .. -DCMAKE_BUILD_TYPE=Debug' • It requires to set it up manually • There is no (convenient?) way to have a configuration phase and a compilation phase. (like `cmake ..' followed by `make') With Builder, you just run `builder-configure' which set up the build system, and `builder-compile' to compile the project. `builder-configure' allow you to easily switch between release and debug. You can try it with the `builder-demo/' directory found inside this git repository: There are more explanations in the README.org. 1 The problem it tries to solve ═══════════════════════════════ Builder tries to solve two issues at the same time: being convenient and being easy to configure. Independently they are not *that* difficult to solve, but together it gets really complex. For example, some build systems need to run their command /outside/ the build directory, while others need to run it /inside/. Also, some commands need to be modified according to the state of the project: Meson needs the flag `--reconfigure' if it was already configured. 2 How it works ══════════════ 2.1 Build system detection ────────────────────────── The first step is the detection of the build system. It simply checks in a list of files which one exists and it returns a list of build system identifiers. For instance if both CMake and Meson are available, it returns the list `("cmake" "meson")'. Notice that the detection is completely separated from build systems addition. This is a deliberate design choice to make it more versatile, for example to filter results or have a cache system (both not implemented). 2.2 Configure and compile ───────────────────────── The configuration is a first step for some build systems (Autotools, CMake, Meson)… Indeed they are not actually build systems, but build system /generator/ (not that it really matters). `builder-configure' and `builder-compile' respectively provide, well, configuration and compilation. They both do what you would expect by proposing relevant commands and running the selected one at the right place. 2.3 Project only or not? ──────────────────────── You will quickly notice that many functions have the argument `variable'. I am not really sure about this one, but it would allow to use a build system not located at the root of a project. I guess it is useful for monorepo projects? I did minimal testing on it and it seems to works. 2.4 Command formatting ────────────────────── Commands pass though the function `builder-format-command' before being run. It uses the function `format-spec` with predefined specifiers, such as `%n` for the number of cores, `%b` for the build directory name… For example "mycommand -proc %n –dir %b" becomes "mycommand -proc 4 –dir build". 2.5 `function-modification' ─────────────────────────── A pretty neat feature is `function-modification': before running, the command is modified by a function. Its power is showcased with the Dune build system and CMake Presets, because you can chose a specific target from a list, and the command is modified as needed! Some details need to be investigated though: should the command pass through `builder-format-command' before being send to the function? After? Or let the function take care of it? 2.6 Configuration ───────────────── The configuration of a build system is hierarchical: at toplevel, it affects every instruction from the build system, but you can configure each instruction independently. For example, you don't need to specify manually that each CMake command need to run inside the directory, but you can still customize a specific command. In the following example, both "debug" and "fast" commands are executed inside the build directory, and "release" is executed at the root of the project. ┌──── │ (builder-add-build-system │ :build-system-id "gcc" │ :compile '(:inside-directory t ;; Affects all instructions │ :instructions │ ((:name "debug" │ :command "gcc main.c -g") │ (:name "release" │ :command "gcc main.c -O2" │ ;; Overrides the higher level :inside-directory │ :inside-directory nil) │ (:name "fast" │ :command "gcc main.c -Ofast")))) └──── 3 Open questions ════════════════ This is a list of problems I don't have a definitive answer to. Suggestions are most welcome. 3.1 Local configuration ─────────────────────── It's necessary to have a way to locally configure a project to add commands, specify the build directory… But I don't really know how to do that. Should it affect the whole project? Only a specific directory (e.g. only `project-root/subdir')? I know that local variables are a thing in Emacs, but they are not a good solution for this since they are actually *buffer* variables. So changing the local configuration would require to reload each local variable even unrelated one that could have been modified on a per buffer basis. Also, the commands cannot be considered as safe, so opening a file trigger a warning each time (unless you mark the values as safe). It would be a good idea to discuss with the Projectile package devs about it, to agree on a common solution if they wish. I have implemented an alternative, dir-val.el. The variables are stored in a tree, each node corresponding to a directory. The variables are "hierarchical". If you have a directory `/dirA/dirB/dirC' and you set a variable to `dirB', then `dirC' will also access it. But you can also change the value only for `dirC'. I'm wondering if this is actually useful. Would project variables be enough? 3.2 Build directory name ──────────────────────── This is harder to solve than it seems. I would like to have a mechanism to change it easily, so you can have `build-release' and `build-debug' directories, allowing you to conveniently switch between release and debug without having to recompile the whole project each time you switch. BUT: some tools have specific expectations about this name. `clangd' expects it to be named `build', and I'm pretty sure that the OCaml ecosystem expect it to be named `_build'. Also, how to know which directory to use to execute a command, as "configure" and "compile" may have different names? With a cache? With a regex to select candidates? Local configuration only? I really would like to have this feature implemented. Currently you can chose to modify the build directory name according to the current git branch (which is pretty reliable), but it would be really useful to have `build-release' and `build-debug' directories. 3.3 Build system detection ────────────────────────── Currently there are few build systems added to the list. But there could be hundreds. How well would it scale? Especially on slow file systems? 3.4 Tramp support ───────────────── I don't use Tramp and have never used it. I don't think it would be too hard to support it, but the detection could be a problem if there are too many build systems. 3.5 Flexibility ─────────────── Is Builder good enough to support every build system? To accommodate most use cases? As I said I don't have a lot of experience in build systems, so suggestions are welcome. 3.6 Adding a build system ───────────────────────── A build system is added with `builder-add-build-system'. Is it good enough? I fear it is a bit too error prone because it's easy to mess with parenthesis and keywords location. How to solve that? With a macro? EIEIO? 3.7 Other ───────── Some other are listed in the README and there are probably many other issues I did not think about. 4 Conclusion ════════════ I hope you will find this package useful. Please tell me if this is unclear, needs more documentation, or if you have issues. Currently only a few build systems are supported. You can already use it to build Emacs with the build system `autotools'. `builder-configure' and `builder-compile' are respectively bind to `C-x p C' and `C-x p c'. `builder-configure' will create a directory named "build" and run `../configure' from it, and `builder-compile' will run `make -jN' with N the number of cores on your processor (the result of `num-processor'). I think this package is far from ready, but I need to know if the design is sound enough and future proof. Obviously I will need to sign the copyright assignment. --------------PVNIFZb1DJRbCkTqrRVUEHyN Content-Type: text/x-emacs-lisp; charset=UTF-8; name="builder.el" Content-Disposition: attachment; filename="builder.el" Content-Transfer-Encoding: base64 Ozs7IGJ1aWxkZXIuZWwgLS0tIEJ1aWxkIGEgcHJvamVjdCBhbmQgcnVuIGl0IC0qLSBsZXhp Y2FsLWJpbmRpbmc6IHQ7IC0qLQoKOzs7IENvcHlyaWdodCAoQykgMjAyMiAgQlR1aW4KOzs7 IFZlcnNpb246IDAuMQo7OzsgUGFja2FnZS1SZXF1aXJlczogKChlbWFjcyAiMjguMSIpKQo7 OzsgSG9tZXBhZ2U6IGh0dHBzOi8vZ2l0bGFiLmNvbS9idHVpbjIvYnVpbGRlcgoKOzsgVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKOzsgKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCjs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo7OyBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv Zgo7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCjs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCgo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQo7OyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KCjs7OyBDb21tZW50 YXJ5Ogo7OzsgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBlYXNlIHRoZSB1 c2Ugb2YgYnVpbGQgc3lzdGVtcyB3aXRoIEVtYWNzLgoKOzs7IENvZGU6CgoocmVxdWlyZSAn cHJvamVjdCkKKHJlcXVpcmUgJ2pzb24pCihyZXF1aXJlICdjbC1saWIpCgo7OyBvbmx5IHVz ZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGJyYW5jaCBuYW1lIHRvIGNyZWF0ZSB0aGUgYnVpbGQg ZGlyCihyZXF1aXJlICd2Yy1naXQpCgo7OyBHbG9iYWwgdmFyaWFibGVzCgooZGVmZ3JvdXAg YnVpbGRlciBuaWwKICAiQ3VzdG9taXphdGlvbnMgZm9yIEJ1aWxkZXIuIgogIDp2ZXJzaW9u IDIKICA6Z3JvdXAgJ3Rvb2xzKQoKKGRlZnZhciBidWlsZGVyLS1pbmZvcyAobWFrZS1oYXNo LXRhYmxlIDp0ZXN0ICdlcXVhbCkKICAiSGFzaCB0YWJsZSBzdG9yaW5nIHRoZSBpbmZvcm1h dGlvbnMgYWJvdXQgdGhlIGJ1aWxkIHN5c3RlbXMuClRoZSBrZXkgaXMgdGhlIGJ1aWxkIHN5 c3RlbWQgSUQsIGEgKGxvd2VyY2FzZT8pIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZQpu YW1lIG9mIHRoZSBidWlsZCBzeXN0ZW0uICBGb3IgZXhhbXBsZSwgdGhlIGtleSBvZiBDTWFr ZSBpcyBcImNtYWtlXCIuCgpUaGUgdmFsdWUgZm9yIGVhY2gga2V5IGlzIGEgcGxpc3Qgd2l0 aCBtdWx0aXBsZSBrZXlzLgpUaG9zZSBrZXlzIGFyZSBzeW1ib2xzLCBhbmQgY3VycmVudGx5 IGFyZSBgOmNvbXBpbGUnLApgOmNvbmZpZ3VyZScgYW5kIGA6cHJpb3JpdHknLgoKRm9yIGA6 Y29tcGlsZScgYW5kIGA6Y29uZmlndXJlJywgdGhlIGF0dGFjaGVkIHZhbHVlcyBhcmUKYWxz byBwbGlzdHMuICBUaG9zZSBwbGlzdCwgY2FsbGVkIGluc3RydWN0aW9ucywgaGF2ZSBrZXlz IHRoYXQgYXJlIGFsc28Kc3ltYm9scy4gIFRob3NlIHN5bWJvbHMgYXJlOgpgOmluc2lkZS1k aXJlY3RvcnknOiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGV4ZWN1dGVk IGluc2lkZQp0aGUgYnVpbGQgZGlyZWN0b3J5IG9yIGluc2lkZSBpdHMgcGFyZW50IGRpcmVj dG9yeS4KYDpmdW5jdGlvbi1tb2RpZmljYXRpb24nOiBhIGZ1bmN0aW9uIHdpdGggdHdvIGFy Z3VtZW50cywgQ09NTUFORCBhbmQgRElSRUNUT1JZLgpDT01NQU5ELCBhIHN0cmluZywgaXMg dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBpbnNpZGUgYSBzaGVsbC4gIFRob3NlIGZ1bmN0aW9u cwpleGlzdCBiZWNhdXNlIHNvbWUgYnVpbGQgc3lzdGVtcyBuZWVkIHRvIGFkZCBhcmd1bWVu dHMgaW4gZGlmZmVyZW50IHNpdHVhdGlvbnMuCkZvciBleGFtcGxlLCBNZXNvbiBuZWVkcyB0 aGUgZmxhZyBcIi0tcmVjb25maWd1cmVcIiBpZiBpdCB3YXMgYWxyZWFkeQpjb25maWd1cmVk IG9uY2UgYmVmb3JlLgpBdCB0aGlzIGxldmVsLCBgOmZ1bmN0aW9uLW1vZGlmaWNhdGlvbicg YXBwbGllcyB0byBldmVyeSBpbnN0cnVjdGlvbnMuCmA6aW5zdHJ1Y3Rpb25zJzogYSBsaXN0 IG9mIGluc3RydWN0aW9ucy4gVGhpcyBpcyB0aGUgZGVlcGVzdCBsZXZlbC4gRGV0YWlsbGVk CmJlbG93LgoKQW4gaW5zdHJ1Y3Rpb24gaXMgYSBwbGlzdCBjb250YWluaW5nIGEgY29tbWFu ZCwgYSBuYW1lLCBhbmQgb3B0aW9ubmFseSBzb21lCnBhcmFtZXRlcnMuIFRoZSB2YWx1ZXMg YXJlOgpgOm5hbWUnOiBhIHN0cmluZyB1c2VkIHRvIGRpc3BsYXkgd2hlbiBhc2tpbmcgdGhl IHVzZXIuCmA6Y29tbWFuZCc6IGEgc3RyaW5nLCB0aGUgY29tbWFuZCB0byBleGVjdXRlIGlu IGEgc2hlbGwuIEJlZm9yZSBleGVjdXRpb24sCml0IGlzIGZvcm1hdHRlZCBieSB0aGUgZnVu Y3Rpb24gYCMnYnVpbGRlci1mb3JtYXQtY29tbWFuZCcuIFNlZSBpdHMKZG9jdW1lbnRhdGlv biBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuCmA6ZnVuY3Rpb24tbW9kaWZpY2F0aW9uJzogc2Vl IGA6ZnVuY3Rpb24tbW9kaWZpY2F0aW9uJyBkZXRhaWxsZWQgdXB3YXJkcy4gQXQKdGhpcyBs ZXZlbCwgb25seSBhcHBsaWVzIHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCgpgOnByaW9yaXR5JyBp cyBhbiBpbnRlZ2VyLiBJdCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZGlzcGxheSBvcmRlciB3 aGVuCmFza2luZyB0aGUgdXNlci4gR3JlYXRlciB2YWx1ZSBtZWFucyBncmVhdGVyIHByaW9y aXR5LiIpCgooZGVmY3VzdG9tIGJ1aWxkZXItZGlyLW5hbWUgImJ1aWxkIgogICJEZWZhdWx0 IGJ1aWxkIGRpcmVjdG9yeSBuYW1lLiIKICA6dHlwZSAnc3RyaW5nCiAgOnZlcnNpb24gIjI4 LjEiCiAgOmdyb3VwICdidWlsZGVyKQoKKGRlZmN1c3RvbSBidWlsZGVyLWNhY2hlLWZpbGUg KGxvY2F0ZS11c2VyLWVtYWNzLWZpbGUgInByb2plY3RzLWJ1aWxkZXIiKQogICJDYWNoZSBm aWxlLgpDdXJyZW50bHkgdW51c2VkLiIKICA6dHlwZSAnZmlsZQogIDp2ZXJzaW9uICIyOC4x IgogIDpncm91cCAnYnVpbGRlcikKCihkZWZjdXN0b20gYnVpbGRlci1lbmFibGUtbXVsdGlw bGUtYnVpbGQtZGlyZWN0b3JpZXMgbmlsCiAgIkN1cnJlbnRseSB1bnVzZWQuCklmIHNldCB0 byB0cnVlLCB1c2Ugb25lIGRpcmVjdG9yeSBwZXIgYnVpbGQgc3lzdGVtIGNvbmZpZ3VyYXRp b24uCkZvciBleGFtcGxlLCBjb25maWd1cmluZyBDTWFrZSBpbiBkZWJ1ZyBtb2RlIHdpbGwg dXNlIHRoZSBkaXJlY3RvcnkKXCJidWlsZC1jbWFrZS1kZWJ1Z1wiLiIKICA6dHlwZSAnYm9v bGVhbgogIDpzYWZlIHQKICA6dmVyc2lvbiAiMjkuMSIKICA6Z3JvdXAgJ2J1aWxkZXIpCgoo ZGVmY3VzdG9tIGJ1aWxkZXItYnVpbGQtZGlyLW5hbWUtZnVuY3Rpb24gIydidWlsZGVyLWdl dC1idWlsZC1kaXItbmFtZS1kZWZhdWx0CiAgIkEgZnVuY3Rpb24gdGhhdCByZXR1cm4gdGhl IG5hbWUgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4iCiAgOnR5cGUgJ2Z1bmN0aW9uCiAgOnNh ZmUgdAogIDp2ZXJzaW9uICIyOS4xIgogIDpncm91cCAnYnVpbGRlcikKCgooZGVmdmFyIGJ1 aWxkZXItYnVpbGQtc3lzdGVtLWZpbGVzCiAgJygoImNtYWtlIiAuICJDTWFrZUxpc3RzLnR4 dCIpCiAgICAoImNtYWtlLXByZXNldHMiIC4gIkNNYWtlUHJlc2V0cy5qc29uIikKICAgICgi bWVzb24iIC4gIm1lc29uLmJ1aWxkIikKICAgICgiYXV0b3Rvb2xzIi4gKCJjb25maWd1cmUi ICJjb25maWd1cmUuYWMiKSkKICAgICgibWFrZSIgLiAiTWFrZWZpbGUiKQogICAgKCJjYXJn byIgLiAiQ2FyZ28udG9tbCIpCiAgICAoImR1bmUiIC4gImR1bmUtcHJvamVjdCIpKSkKCgoo ZGVmaW5lLWtleSBwcm9qZWN0LXByZWZpeC1tYXAgIkMiICdidWlsZGVyLWNvbmZpZ3VyZSkK KGRlZmluZS1rZXkgcHJvamVjdC1wcmVmaXgtbWFwICJjIiAnYnVpbGRlci1jb21waWxlKQoK DAo7OyBHZW5lcmFsIGZ1bmN0aW9ucwoKCihjbC1kZWZ1biBidWlsZGVyLWNvbXBpbGF0aW9u LWJ1ZmZlci1uYW1lLWZ1bmN0aW9uLWNyZWF0b3IgKCZrZXkgYnVpbGQtc3lzdGVtLWlkIG5h bWUgdHlwZSkKICAiUmV0dXJuIGEgKmZ1bmN0aW9uKiB3aGljaCByZXR1cm4gdGhlIG5hbWUg b2YgdGhlIGNvbXBpbGF0aW9uIGJ1ZmZlci4KQlVJTEQtU1lTVEVNLUlEIGlzIHRoZSBuYW1l IG9mIHRoZSBidWlsZCBzeXN0ZW0gKGUuZy4gXCJjbWFrZVwiLCBcIm1ha2VcIi4uLikuCk5B TUUgaXMgdGhlIHR5cGUgb2YgYnVpbGQsIHN1Y2ggYXMgXCJkZWJ1Z1wiLCBcInJlbGVhc2Vc Ii4uLgpUWVBFIGlzIHRoZSB0eXBlIG9mIGNvbW1hbmQsIHN1Y2ggYXMgXCJjb21waWxlXCIs IFwiY29uZmlndXJlXCIuLi4iCiAgKGxhbWJkYSAobW9kZSkgKGNvbmNhdCAiKiIgKGRvd25j YXNlIG1vZGUpICIgIgogICAgICAgICAgICAgICAgICAgICAgICAgIiA8IgogICAgICAgICAg ICAgICAgICAgICAgICAgKHByb2plY3QtbmFtZSAocHJvamVjdC1jdXJyZW50KSkKICAgICAg ICAgICAgICAgICAgICAgICAgICI+ICIKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUK ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkLXN5c3RlbS1pZCAiICIKICAgICAgICAg ICAgICAgICAgICAgICAgIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICIqIikpKQoK KGRlZnVuIGJ1aWxkZXItZ2V0LWJ1aWxkLWRpci1uYW1lLWRlZmF1bHQgKCZyZXN0IF8pCiAg IlJldHVybiB0aGUgYnVpbGQgZGlyIG5hbWUgZ2l2ZW4gYnkgdGhlIGN1c3RvbWl6YWJsZSB2 YXJpYWJsZSBCVUlMRC1ESVItTkFNRS4iCiAgKGxldCAoKGJ1aWxkLWRpci1uYW1lIChvciBi dWlsZGVyLWRpci1uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbGQiKSkp CiAgICBidWlsZC1kaXItbmFtZSkpCgooZGVmdW4gYnVpbGRlci1nZXQtYnVpbGQtZGlyLW5h bWUtdmMtYnJhbmNoICgmcmVzdCBfKQogICJSZXR1cm4gQlVJTEQtRElSLU5BTUUgY29uY2F0 ZW5hdGVkIHdpdGggdGhlIGN1cnJlbnQgYnJhbmNoLgpGb3IgZXhhbXBsZSwgaWYgdGhlIHBy b2plY3QgaXMgc2V0IG9uIHRoZSBicmFuY2ggXCJidWdmaXhcIiwgdGhlIHJldHVybmVkCm5h bWUgaXMgXCJidWlsZC1idWdmaXhcIi4iCiAgKGxldCAoKGJ1aWxkLWRpci1uYW1lIChvciBi dWlsZGVyLWRpci1uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbGQiKSkK ICAgICAgICAoY3VycmVudC12Yy1iYWNrZW5kICh2Yy1yZXNwb25zaWJsZS1iYWNrZW5kICIu IiB0KSkpCiAgICAoY29uY2F0CiAgICAgYnVpbGQtZGlyLW5hbWUgIi0iCiAgICAgKGNvbmQg KChzdHJpbmc9IGN1cnJlbnQtdmMtYmFja2VuZCAiR2l0IikKICAgICAgICAgICAgKGNhciAo dmMtZ2l0LWJyYW5jaGVzKSkpCiAgICAgICAgICAgKHQgKG1lc3NhZ2UgIkNvdWxkIG5vdCBk ZXRlcm1pbmUgYnJhbmNoIG5hbWUgZnJvbSB2ZXJzaW9uIGNvbnRyb2wiKSkpKSkpCgooZGVm dW4gYnVpbGRlci1nZXQtYnVpbGQtZGlyLW5hbWUtd2l0aC1idWlsZC1jb25maWd1cmF0aW9u IChjb25maWd1cmF0aW9uICZyZXN0IF8pCiAgIlJldHVybiBCVUlMRC1ESVItTkFNRSBjb25j YXRlbmF0ZWQgd2l0aCBDT05GSUdVUkFUSU9OIChXQVJOSU5HISEhIEJST0tFTikuCldBUk5J TkchISEgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhY3R1YWxseSBjb21wbGV0ZWx5IGJyb2tl biwgYmVhY2F1c2UgdGhlCmNvbmZpZ3VyYXRpb24gYW5kIHRoZSBjb21waWxhdGlvbiBpbnN0 cnVjdGlvbnMgbmVlZCB0byBoYXZlIGV4YWN0bHkgdGhlIHNhbWUKbmFtZS4gIFRoaXMgbmVl ZHMgdG8gYmUgcmV0aG91Z2h0LiAgTWF5YmUgdXNlIGEgc29tZSBraW5kIG9mIHJlZ2V4IHRv IGdldAp0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5PyBMaWtlIFwiYnVpbGQoXFwtLispP1wi PwpPcmlnaW5hbCBkb2N1bWVudGF0aW9uIGJlbG93LgpDT05GSUdVUkFUSU9OIGlzIHRoZSBi dWlsZCBzeXN0ZW0gY29uZmlndXJhdGlvbi4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0 bwpidWlsZCB0aGUgcHJvamVjdCBpbiByZWxlYXNlIG1vZGUsIHRoZSByZXN1bHQgd2lsbCBi ZSBcImJ1aWxkLXJlbGVhc2VcIi4KVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcXVp Y2tseSBzd2l0Y2ggYmV0d2VlbiByZWxlYXNlIGFuZCBkZWJ1ZywKYXMgc29tZSBidWlsZCBz eXN0ZW1zIHdpbGwgbmVlZCBhIGNvbXBsZXRlIHJlY29tcGlsYXRpb24uIgogIChsZXQgKChi dWlsZC1kaXItbmFtZSAob3IgYnVpbGRlci1kaXItbmFtZQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgImJ1aWxkIikpKQogICAgKGNvbmNhdAogICAgIGJ1aWxkLWRpci1uYW1lICIt IiBjb25maWd1cmF0aW9uKSkpCgooZGVmdW4gYnVpbGRlci0tZ2V0LWJ1aWxkLWRpci1wYXJl bnQgKCZvcHRpb25hbCBkaXJlY3RvcnkpCiAgIlJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBv ZiB0aGUgYnVpbGQgZGlyZWN0b3J5J3MgcGFyZW50LgpESVJFQ1RPUlkgaXMgdGhlIHBhcmVu dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LCByZWxhdGl2ZSB0bwp0aGUgcHJvamVjdCByb290 IG9yIGNhbiBhbiBhc2JvbHV0ZSBwYXRoLiAgSWYgbmlsLCB0aGUKcHJvamVjdCByb290IGlz IHJldHVybmVkLiIKICAoaWYgZGlyZWN0b3J5CiAgICAgIChleHBhbmQtZmlsZS1uYW1lIGRp cmVjdG9yeSAocHJvamVjdC1yb290IChwcm9qZWN0LWN1cnJlbnQpKSkKICAgIChwcm9qZWN0 LXJvb3QgKHByb2plY3QtY3VycmVudCkpKSkKCgooZGVmdW4gYnVpbGRlci0tZ2V0LWJ1aWxk LWRpci1uYW1lLWFic29sdXRlICgmb3B0aW9uYWwgZGlyZWN0b3J5KQogICJSZXR1cm4gdGhl IGFic29sdXRlIHBhdGggb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KSWYgc2V0LCBESVJFQ1RP UlkgaXMgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGJ1aWxkIGRpci4KRElSRUNUT1JZ IGlzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QsIG9yIGNhbiBiZSBhYnNvbHV0ZS4i CiAgKGV4cGFuZC1maWxlLW5hbWUKICAgKGZ1bmNhbGwgYnVpbGRlci1idWlsZC1kaXItbmFt ZS1mdW5jdGlvbikKICAgKGJ1aWxkZXItLWdldC1idWlsZC1kaXItcGFyZW50IGRpcmVjdG9y eSkpKQoKCihkZWZ1biBidWlsZGVyLS1nZXQtcGF0aC1yZWxhdGl2ZS10by1wcm9qZWN0IChk aXJlY3RvcnkpCiAgIlJldHVybiBESVJFQ1RPUlkgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qg cm9vdC4iCiAgKGZpbGUtcmVsYXRpdmUtbmFtZSBkaXJlY3RvcnkgKHByb2plY3Qtcm9vdCAo cHJvamVjdC1jdXJyZW50KSkpKQoKCihkZWZ1biBidWlsZGVyLXJlbG9hZC1kaXItbG9jYWxz LXByb2plY3QgKCkKICAiVXBkYXRlIGJ1ZmZlciB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBmaWxl IFwiZGlyLWxvY2Fscy5lbFwiLgpDdXJyZW50bHkgdW51c2VkLCB3YXMgY3JlYXRlZCB0byBl eHBlcmltZW50IHdpdGggZGlyLWxvY2Fscy5lbCB0bwpjcmVhdGUgcHJvamVjdC1sb2NhbCBp bnN0cnVjdGlvbnMuIgogIChpbnRlcmFjdGl2ZSkKICAobGV0ICgoZGlyIChwcm9qZWN0LXJv b3QgKHByb2plY3QtY3VycmVudCkpKQogICAgICAgIChlbmFibGUtbG9jYWwtdmFyaWFibGVz IHQpKQogICAgKGRvbGlzdCAoYnVmZmVyIChidWZmZXItbGlzdCkpCiAgICAgICh3aXRoLWN1 cnJlbnQtYnVmZmVyIGJ1ZmZlcgogICAgICAgICh3aGVuIChlcXVhbCBkZWZhdWx0LWRpcmVj dG9yeSBkaXIpCiAgICAgICAgICAoaGFjay1kaXItbG9jYWwtdmFyaWFibGVzLW5vbi1maWxl LWJ1ZmZlcikpKSkpKQoKCihkZWZ1biBidWlsZGVyLS1kZXRlY3QtYnVpbGQtc3lzdGVtcy1s aXN0IChkaXJlY3RvcnkpCiAgIlJldHVybiBhIGxpc3Qgb2YgZGV0ZWN0ZWQgYnVpbGQgc3lz dGVtcyBpbnNpZGUgRElSRUNUT1JZLgpESVJFQ1RPUlkgaXMgZWl0aGVyIGFic29sdXRlIG9y IHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBwcm9qZWN0LiIKICAobGV0ICgoZGlyZWN0 b3J5IChidWlsZGVyLS1nZXQtYnVpbGQtZGlyLXBhcmVudCBkaXJlY3RvcnkpKQogICAgICAg IChkZXRlY3RlZC1idWlsZC1zeXN0ZW1zIChsaXN0KSkpCiAgICAoZG9saXN0IChzeXN0ZW0t ZmlsZS1saXN0IGJ1aWxkZXItYnVpbGQtc3lzdGVtLWZpbGVzKQogICAgICAoZG9saXN0IChz eXN0ZW0tZmlsZSAoZW5zdXJlLWxpc3QgKGNkciBzeXN0ZW0tZmlsZS1saXN0KSkpCiAgICAg ICAgKHdoZW4gKGZpbGUtZXhpc3RzLXAgKGV4cGFuZC1maWxlLW5hbWUgc3lzdGVtLWZpbGUg ZGlyZWN0b3J5KSkKICAgICAgICAgIChjbC1wdXNobmV3IChjYXIgc3lzdGVtLWZpbGUtbGlz dCkgZGV0ZWN0ZWQtYnVpbGQtc3lzdGVtcyA6dGVzdCAjJ2VxdWFsKSkpKQogICAgICBkZXRl Y3RlZC1idWlsZC1zeXN0ZW1zKSkKCgooZGVmdW4gYnVpbGRlci1kZXRlY3QtYnVpbGQtc3lz dGVtICgmb3B0aW9uYWwgZGlyZWN0b3J5KQogICJSZXR1cm4gdGhlIGlkZW50aWZpZXIgb2Yg b25lIGRldGVjdGVkIGFuZCBzZWxlY3RlZCBidWlsZCBzeXN0ZW0uClRoZSBkZXRlY3Rpb24g b2NjdXJzIGluc2lkZSBESVJFQ1RPUlkgaWYgc2V0LCBvdGhlcndpc2UgYXQgdGhlIHJvb3QK b2YgdGhlIHByb2plY3QuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgYnVpbGQgc3lzdGVtcywg YXNrcyB0aGUgdXNlcgp0byBzZWxlY3Qgb25lLgpSZXR1cm4gbmlsIGlmIG5vIGJ1aWxkIHN5 c3RlbSBpcyBkZXRlY3RlZC4iCiAgKGxldCAoKGJ1aWxkLXN5c3RlbS1saXN0IChidWlsZGVy LS1kZXRlY3QtYnVpbGQtc3lzdGVtcy1saXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAob3IgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWxk ZXItLWdldC1idWlsZC1kaXItcGFyZW50KSkpKSkKICAgIChjb25kICgoemVyb3AgKGxlbmd0 aCBidWlsZC1zeXN0ZW0tbGlzdCkpCiAgICAgICAgICAgbmlsKQogICAgICAgICAgKChsZW5n dGg9IGJ1aWxkLXN5c3RlbS1saXN0IDEpCiAgICAgICAgICAgKG1lc3NhZ2UgKGNhciBidWls ZC1zeXN0ZW0tbGlzdCkpKQogICAgICAgICAgKHQKICAgICAgICAgICAoY29tcGxldGluZy1y ZWFkICJTZWxlY3QgYnVpbGQgc3lzdGVtOiAiIGJ1aWxkLXN5c3RlbS1saXN0IG5pbCB0KSkp KSkKCgooY2wtZGVmdW4gYnVpbGRlci1hZGQtYnVpbGQtc3lzdGVtICgma2V5IGJ1aWxkLXN5 c3RlbS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25m aWd1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGls ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSkK ICAiQWRkIGEgYnVpbGQgc3lzdGVtIHRvIHRoZSBoYXNoIHRhYmxlIEJVSUxERVItLUlORk9T LgpCVUlMRC1TWVNURU0tSUQgaXMgYSBzdHJpbmcgaW5kZW50aWZ5aW5nIHRoZSBidWlsZCBz eXN0ZW0uCkNPTkZJR1VSRSBpcyBhIHBsaXN0IGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9u cyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uCkNPTVBJTEUgaXMgYSBwbGlzdCBjb250YWluaW5n IHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjb25maWd1cmF0aW9uLgpQUklPUklUWSBpcyBh biBpbnRlZ2VyIHVzZWQgdG8gY2hvc2UgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGJ1aWxk IHN5c3RlbSIKICAobGV0ICgoYnVpbGQtc3lzdGVtLWluZm9zIG5pbCkpCiAgICAoc2V0cSBi dWlsZC1zeXN0ZW0taW5mb3MKICAgICAgICAgIChwbGlzdC1wdXQgYnVpbGQtc3lzdGVtLWlu Zm9zIDpjb25maWd1cmUgY29uZmlndXJlKSkKICAgIChzZXRxIGJ1aWxkLXN5c3RlbS1pbmZv cwogICAgICAgICAgKHBsaXN0LXB1dCBidWlsZC1zeXN0ZW0taW5mb3MgOmNvbXBpbGUgY29t cGlsZSkpCiAgICAoc2V0cSBidWlsZC1zeXN0ZW0taW5mb3MKICAgICAgICAgIChwbGlzdC1w dXQgYnVpbGQtc3lzdGVtLWluZm9zIDpwcmlvcml0eSAob3IgcHJpb3JpdHkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpKQogICAg KHB1dGhhc2ggYnVpbGQtc3lzdGVtLWlkIGJ1aWxkLXN5c3RlbS1pbmZvcyBidWlsZGVyLS1p bmZvcykpKQoKCihjbC1kZWZ1biBidWlsZGVyLWFkZC1pbnN0cnVjdGlvbiAoJmtleSBidWls ZC1zeXN0ZW0taWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rp b24pCiAgIkFkZCBhbiBpbnN0cnVjdGlvbiB0byB0aGUgZ2xvYmFsIHRhYmxlLgpCVUlMRC1T WVNURU0tSUQgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGJ1aWxkIHN5c3RlbSAoYSBzdHJp bmcpLgpUWVBFIGlzIGVpdGhlciA6Y29uZmlndXJlIG9yIDpjb21waWxlLgpJTlNUUlVDVElP TiBpcyBhIHBsaXN0IHdpdGggYSBrZXkgOm5hbWUsIGEga2V5IDpjb21tYW5kIGFuZCBvdGhl cgpvcHRpb25hbCBrZXlzLiIKICAobGV0KiAoKGJ1aWxkLWluZm9zIChnZXRoYXNoIGJ1aWxk LXN5c3RlbS1pZCBidWlsZGVyLS1pbmZvcykpCiAgICAgICAgICh0eXBlLWluZm9zIChwbGlz dC1nZXQgYnVpbGQtaW5mb3MgdHlwZSApKQogICAgICAgICAoaW5zdHJ1Y3Rpb25zLWxpc3Qg KHBsaXN0LWdldCB0eXBlLWluZm9zICA6aW5zdHJ1Y3Rpb25zKSkpCiAgICAoY2wtcHVzaG5l dyBpbnN0cnVjdGlvbiBpbnN0cnVjdGlvbnMtbGlzdAogICAgICAgICAgICAgICAgOnRlc3Qg KGxhbWJkYSAoeCB5KSAoc3RyaW5nLWVxdWFsIChwbGlzdC1nZXQgeCA6bmFtZSkKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxpc3QtZ2V0 IHkgOm5hbWUpKSkpCiAgICAoc2V0cSBidWlsZC1pbmZvcyAocGxpc3QtcHV0IGJ1aWxkLWlu Zm9zIHR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LXB1dCB0 eXBlLWluZm9zIDppbnN0cnVjdGlvbnMgaW5zdHJ1Y3Rpb25zLWxpc3QpKSkKICAgIChwdXRo YXNoIGJ1aWxkLXN5c3RlbS1pZCBidWlsZC1pbmZvcyBidWlsZGVyLS1pbmZvcykpKQoKCihj bC1kZWZ1biBidWlsZGVyLXJlbW92ZS1pbnN0cnVjdGlvbiAoJmtleSBidWlsZC1zeXN0ZW0t aWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKICAiUmVt b3ZlIGFuIGluc3RydWN0aW9uIGZyb20gdGhlIGdsb2JhbCB0YWJsZS4KQlVJTEQtU1lTVEVN LUlEIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBidWlsZCBzeXN0ZW0gKGEgc3RyaW5nKS4K VFlQRSBpcyBlaXRoZXIgOmNvbmZpZ3VyZSBvciA6Y29tcGlsZS4KTkFNRSBpcyB0aGUgbmFt ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gcmVtb3ZlLiIKICAobGV0KiAoKGJ1aWxkLWluZm9z IChnZXRoYXNoIGJ1aWxkLXN5c3RlbS1pZCBidWlsZGVyLS1pbmZvcykpCiAgICAgICAgICh0 eXBlLWluZm9zIChwbGlzdC1nZXQgYnVpbGQtaW5mb3MgdHlwZSApKQogICAgICAgICAoaW5z dHJ1Y3Rpb25zLWxpc3QgKHBsaXN0LWdldCB0eXBlLWluZm9zICA6aW5zdHJ1Y3Rpb25zKSkp CiAgICAoc2V0cSBpbnN0cnVjdGlvbnMtbGlzdAogICAgICAgICAgKGNsLXJlbW92ZS1pZiAo bGFtYmRhICh4KSAoc3RyaW5nLWVxdWFsIChwbGlzdC1nZXQgeCA6bmFtZSkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSkgaW5zdHJ1 Y3Rpb25zLWxpc3QpKQogICAgKHNldHEgYnVpbGQtaW5mb3MgKHBsaXN0LXB1dCBidWlsZC1p bmZvcyB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbGlzdC1wdXQg dHlwZS1pbmZvcyA6aW5zdHJ1Y3Rpb25zIGluc3RydWN0aW9ucy1saXN0KSkpCiAgICAocHV0 aGFzaCBidWlsZC1zeXN0ZW0taWQgYnVpbGQtaW5mb3MgYnVpbGRlci0taW5mb3MpKSkKCgoo ZGVmdW4gYnVpbGRlci0tZ2V0LWluc3RydWN0aW9uLXByaW9yaXR5IChpbnN0cnVjdGlvbikK ICAiR2V0IHRoZSBwcmlvcml0eSBvZiBhbiBpbnN0cnVjdGlvbi4KSU5TVFJVQ1RJT04gaXMg YSBwbGlzdCB0aGF0IG1heSBjb250YWluIHRoZSBrZXkgYDpwcmlvcml0eScsCmxpbmtpbmcg dG8gYW4gaW50ZWdlci4KSWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCwgdGhlIHByaW9yaXR5 IGlzIDAuIgogIChsZXQgKChwcmlvcml0eSAocGxpc3QtZ2V0IGluc3RydWN0aW9uIDpwcmlv cml0eSkpKQogICAgKGlmIHByaW9yaXR5CiAgICAgICAgcHJpb3JpdHkKICAgICAgMCkpKQoK KGRlZnVuIGJ1aWxkZXItLWNvbXBhcmUtaW5zdHJ1Y3Rpb25zLXByaW9yaXR5ICh4IHkpCiAg IkNvbXBhcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnN0cnVjdGlvbnMgWCBhbmQgWS4KUmV0 dXJucyB0cnVlIGlmIFggaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBZLiIKICAoPCAoYnVp bGRlci0tZ2V0LWluc3RydWN0aW9uLXByaW9yaXR5IHgpCiAgICAgKGJ1aWxkZXItLWdldC1p bnN0cnVjdGlvbi1wcmlvcml0eSB5KSkpCgoKKGRlZnVuIGJ1aWxkZXItLWdldC1pbnN0cnVj dGlvbi1saXN0IChidWlsZC1zeXN0ZW0taWQgaW5zdHJ1Y3Rpb24tdHlwZSkKICAiUmV0dXJu IGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMgZm9yIHRoZSBidWlsZCBzeXN0ZW0uCkJVSUxELVNZ U1RFTS1JRCBpcyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgYnVpbGQgc3lzdGVtLApzdWNo IGFzIFwiY21ha2VcIiBvciBcIm1lc29uXCIuCklOU1RSVUNUSU9OLVRZUEUgaXMgYSBzeW1i b2wsIHN1Y2ggYXMgYDpjb25maWcnIG9yIGA6Y29tcGlsZScuIgogIChsZXQqICgoaW5zdHJ1 Y3Rpb25zICgpKQogICAgICAgICAoYnVpbGQtc3lzdGVtLWRhdGEgKGdldGhhc2ggYnVpbGQt c3lzdGVtLWlkIGJ1aWxkZXItLWluZm9zKSkKICAgICAgICAgKGdsb2JhbC1pbnN0cnVjdGlv bi10eXBlLWRhdGEgKHBsaXN0LWdldCBidWlsZC1zeXN0ZW0tZGF0YSBpbnN0cnVjdGlvbi10 eXBlKSkpCiAgICAoZG9saXN0IChuZXctaW5zdHJ1Y3Rpb24gKHBsaXN0LWdldCBnbG9iYWwt aW5zdHJ1Y3Rpb24tdHlwZS1kYXRhIDppbnN0cnVjdGlvbnMpKQogICAgICAoY2wtcHVzaG5l dwogICAgICAgKGRvbGlzdCAoc3ltYm9sICcoOmluc2lkZS1kaXJlY3RvcnkKICAgICAgICAg ICAgICAgICAgICAgICAgIDpmdW5jdGlvbi1tb2RpZmljYXRpb24pCiAgICAgICAgICAgICAg ICAgICAgICAgbmV3LWluc3RydWN0aW9uKQogICAgICAgICAobGV0ICgodmFsdWUgKHBsaXN0 LWdldCBnbG9iYWwtaW5zdHJ1Y3Rpb24tdHlwZS1kYXRhIHN5bWJvbCkpKQogICAgICAgICAg IChpZiAocGxpc3QtbWVtYmVyIG5ldy1pbnN0cnVjdGlvbiBzeW1ib2wpCiAgICAgICAgICAg ICAgIG5ldy1pbnN0cnVjdGlvbgogICAgICAgICAgICAgKHNldHEgbmV3LWluc3RydWN0aW9u IChwbGlzdC1wdXQgbmV3LWluc3RydWN0aW9uIHN5bWJvbCB2YWx1ZSkpKSkpCiAgICAgICBp bnN0cnVjdGlvbnMKICAgICAgIDp0ZXN0IChsYW1iZGEgKHggeSkKICAgICAgICAgICAgICAg KHN0cmluZy1lcXVhbAogICAgICAgICAgICAgICAgKHBsaXN0LWdldCB4IDpuYW1lKQogICAg ICAgICAgICAgICAgKHBsaXN0LWdldCB5IDpuYW1lKSkpKSkKICAgIDs7IE5vdCBzdXJlIGlm IHRoZSBwcmlvcml0eSBzeXN0ZW0gYWN0dWFsbHkgd29ya3MsIG5vciBpZiBpdCBpcyBkZXNp cmFibGUuLi4KICAgIChzb3J0IGluc3RydWN0aW9ucyAjJ2J1aWxkZXItLWNvbXBhcmUtaW5z dHJ1Y3Rpb25zLXByaW9yaXR5KSkpCgoKKGRlZnVuIGJ1aWxkZXItLWZpbmQtaW4tbGlzdC1v Zi1wbGlzdCAocGxpc3QtbGlzdCB2YWx1ZSBrZXkpCiAgIkluIGEgbGlzdCBvZiBwbGlzdCwg cmV0dXJuIHRoZSBwbGlzdCBtYXRjaGluZyB0aGUgdmFsdWUgVkFMVUUgZm9yIHRoZSBrZXkg S0VZLgpQTElTVC1MSVNUIGlzIGEgbGlzdCBvZiBwbGlzdCwgc3VjaCBhcwpgKCg6bmFtZSBc Im5hbWUxXCIgLi4uKSAoOm5hbWUgXCJuYW1lMlwiLi4uKSknIgogIChjbC1maW5kIHZhbHVl IHBsaXN0LWxpc3QgOnRlc3QgKGxhbWJkYSAoc3RyIHBsKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoc3RyaW5nLWVxdWFsIHN0ciAocGxpc3QtZ2V0IHBsIGtleSkp KSkpCgoKKGRlZnVuIGJ1aWxkZXItLXNlbGVjdC1pbnN0cnVjdGlvbiAoaW5zdHJ1Y3Rpb24t bGlzdCBtZXNzYWdlKQogICJBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGluc3RydWN0aW9u IGZyb20gSU5TVFJVQ1RJT04tTElTVC4KSU5TVFJVQ1RJT04tTElTVCBpcyBhIGxpc3Qgb2Yg cGxpc3QsIGFuZCB0aGUgZnVuY3Rpb24gZGlzcGxheXMKdGhlIGA6bmFtZScgdmFsdWUgb2Yg ZWFjaCBwbGlzdCB0byBtYWtlIHRoZSBjaG9pY2UuCkl0IGFsc28gZGlzcGxheXMgdGhlIHN0 cmluZyBNRVNTQUdFIHRvIHRoZSB1c2VyLiIKICAoY29uZCAoKGxlbmd0aD0gaW5zdHJ1Y3Rp b24tbGlzdCAxKQogICAgICAgICAocGxpc3QtZ2V0IChjYXIgaW5zdHJ1Y3Rpb24tbGlzdCkg Om5hbWUpKQogICAgICAgICgobGVuZ3RoPiBpbnN0cnVjdGlvbi1saXN0IDEpCiAgICAgICAg IChjb21wbGV0aW5nLXJlYWQKICAgICAgICAgIG1lc3NhZ2UKICAgICAgICAgIChjbC1tYXAg J2xpc3QgKGxhbWJkYSAoeCkgKHBsaXN0LWdldCB4IDpuYW1lKSkgaW5zdHJ1Y3Rpb24tbGlz dCkpKSkpCgooZGVmdW4gYnVpbGRlci1mb3JtYXQtY29tbWFuZCAoY29tbWFuZCAmb3B0aW9u YWwgZGlyZWN0b3J5KQogICJGb3JtYXQgdGhlIHN0cmluZyBDT01NQU5EIGJ5IHJlcGxhY2lu ZyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMuCkl0IHVzZXMgdGhlIGZ1bmN0aW9uIGBmb3JtYXQt c3BlYycuCkRJUkVDVE9SWSBpcyB0aGUgcGFyZW50IG9mIHRoZSBidWlsZCBkaXJlY3Rvcnku CgpUaGVyZSBhcmUgbXVsdGlwbGUgZm9ybWF0IHNwZWNpZmljYXRpb25zLgpgJWInIGlzIHRo ZSBidWlsZCBkaXJlY3RvcnkgbmFtZSwgcXVvdHRlZCB3aXRoIGBzaGVsbC1xdW90ZS1hcmd1 bWVudCcuCmAlbicgaXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIChjb3JlKSBhdmFpbGFi bGVzLiAgUHJvdmlkZWQgYnkgdGhlCmZ1bmN0aW9uIGBudW0tcHJvY2Vzc29ycycuCmAlcCcg aXMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBhcmVudCBvZiB0aGUgYnVpbGQgZGlyZWN0 b3J5LCBxdW90dGVkCndpdGggYHNoZWxsLXF1b3RlLWFyZ3VtZW50JwpgJWYnIGlzIHRoZSBh YnNvbHV0ZSBwYXRoIG9mIHRoZSBidWlsZCBkaXJlY3RvcnksIHF1b3R0ZWQgd2l0aApgc2hl bGwtcXVvdGUtYXJndW1lbnQnCgpGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgYSBcIm1ha2Vc IiBjb21tYW5kIHRoYXQgdXNlIGFsbCBvZiB5b3VyIGNvcmVzLCB5b3UKY2FuIHVzZSB0aGUg c3RyaW5nIFwiY21ha2UgLWolblwiLiAgSWYgeW91ciBwcm9jZXNzb3IgaGFzIDQgY29yZXMs IGl0IHdpbGwKYmUgdHJhbnNmb3JtZWQgdG8gXCJjbWFrZSAtajRcIi4iCiAgKGZvcm1hdC1z cGVjCiAgIChvciBjb21tYW5kICIiKQogICBgKCg/YiAuICwoc2hlbGwtcXVvdGUtYXJndW1l bnQgKGZ1bmNhbGwgYnVpbGRlci1idWlsZC1kaXItbmFtZS1mdW5jdGlvbikpKQogICAgICg/ biAuICwobnVtLXByb2Nlc3NvcnMpKQogICAgICg/cCAuICwoc2hlbGwtcXVvdGUtYXJndW1l bnQgKGJ1aWxkZXItLWdldC1idWlsZC1kaXItcGFyZW50IGRpcmVjdG9yeSkpKQogICAgICg/ ZiAuICwoc2hlbGwtcXVvdGUtYXJndW1lbnQgKGJ1aWxkZXItLWdldC1idWlsZC1kaXItbmFt ZS1hYnNvbHV0ZSBkaXJlY3RvcnkpKSkpKSkKCgooY2wtZGVmdW4gYnVpbGRlci0tZXhlY3V0 ZS1jb21tYW5kICgma2V5IGluc3RydWN0aW9uIGRpcmVjdG9yeSkKICAiRXhlY3V0ZSB0aGUg Y29tbWFuZCBmcm9tIElOU1RSVUNUSU9OLgpJTlNUUlVDVElPTiBpcyBhIHBsaXN0IHdpdGgg dGhlIGtleSBgOmNvbW1hbmQnLCB3aXRoIGEgc3RyaW5nIGNvbW1hbmQgYXMKYSB2YWx1ZS4K TUVTU0FHRSBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiBhc2tlZCB0byBjb25maXJt IHRoZSBjb21tYW5kLgpESVJFQ1RPUlkgdGhlIHBhcmVudCBvZiB0aGUgYnVpbGQgZGlyZWN0 b3J5LgpNT0RJRklDQVRJT04tRlVOQyBpcyBhIGZ1bmN0aW9uIG1vZGlmeWluZyB0aGUgY29t bWFuZC4iCiAgKGxldCogKChidWlsZC1kaXItYWJzb2x1dGUtZGlyZWN0b3J5CiAgICAgICAg ICAoYnVpbGRlci0tZ2V0LWJ1aWxkLWRpci1uYW1lLWFic29sdXRlIGRpcmVjdG9yeSkpCiAg ICAgICAgIChmb3JtYXR0ZWQtY29tbWFuZAogICAgICAgICAgKGJ1aWxkZXItZm9ybWF0LWNv bW1hbmQgKHBsaXN0LWdldCBpbnN0cnVjdGlvbiA6Y29tbWFuZCkgZGlyZWN0b3J5KSkKICAg ICAgICAgKHdvcmstZGlyZWN0b3J5IG5pbCkKICAgICAgICAgKGluc2lkZS1kaXJlY3Rvcnkg KHBsaXN0LWdldCBpbnN0cnVjdGlvbiA6aW5zaWRlLWRpcmVjdG9yeSkpKQogICAgKHdoZW4g KG5vdCAoZmlsZS1kaXJlY3RvcnktcCBidWlsZC1kaXItYWJzb2x1dGUtZGlyZWN0b3J5KSkK ICAgICAgOzsgU2hvdWxkIHdlIGFzayBiZWZvcmUgY3JlYXRpbmcgdGhlIGRpcmVjdG9yeT8K ICAgICAgKG1ha2UtZGlyZWN0b3J5IGJ1aWxkLWRpci1hYnNvbHV0ZS1kaXJlY3RvcnkpKQog ICAgKGlmIGluc2lkZS1kaXJlY3RvcnkKICAgICAgICAoc2V0cSB3b3JrLWRpcmVjdG9yeSBi dWlsZC1kaXItYWJzb2x1dGUtZGlyZWN0b3J5KQogICAgICAoc2V0cSB3b3JrLWRpcmVjdG9y eSAoYnVpbGRlci0tZ2V0LWJ1aWxkLWRpci1wYXJlbnQgZGlyZWN0b3J5KSkpCiAgICAobGV0 ICgoZGVmYXVsdC1kaXJlY3Rvcnkgd29yay1kaXJlY3RvcnkpKQogICAgICAoY29tcGlsZSAo cmVhZC1zdHJpbmcKICAgICAgICAgICAgICAgIChjb25jYXQKICAgICAgICAgICAgICAgICAo d2hlbiBpbnNpZGUtZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJbaW4g XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWlsZGVyLS1nZXQtcGF0aC1yZWxh dGl2ZS10by1wcm9qZWN0IHdvcmstZGlyZWN0b3J5KQogICAgICAgICAgICAgICAgICAgICAg ICAgICAiXCJdICIpKQogICAgICAgICAgICAgICAgICJDb21tYW5kOiAiKQogICAgICAgICAg ICAgICAgKGlmIChwbGlzdC1nZXQgaW5zdHJ1Y3Rpb24gOmZ1bmN0aW9uLW1vZGlmaWNhdGlv bikKICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCAocGxpc3QtZ2V0IGluc3RydWN0aW9u IDpmdW5jdGlvbi1tb2RpZmljYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Zm9ybWF0dGVkLWNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rv cnkpCiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZC1jb21tYW5kKSkpKSkpCgoKOzs7IyMj YXV0b2xvYWQKKGRlZnVuIGJ1aWxkZXItY29uZmlndXJlICgmb3B0aW9uYWwgZGlyZWN0b3J5 KQogICJDb25maWd1cmUgdGhlIGJ1aWxkIHN5c3RlbS4KClRoZSBjb25maWd1cmF0aW9uIG9m IGEgYnVpbGQgc3lzdGVtIGlzIGEgc3RlcCBoYXBwZW5pbmcgYmVmb3JlIGNvbXBpbGF0aW9u LgpTb21lIFwiYnVpbGQgc3lzdGVtc1wiLCBzdWNoIGFzIEF1dG90b29scyBvciBDTWFrZSBh cmUgbm90IGFjdHVhbGx5IGJ1aWxkCnN5c3RlbXMuIFRoZXkgYXJlIGluIHJlYWxpdHkgYnVp bGQgc3lzdGVtcyBnZW5lcmF0b3IuIFRoZWlyIGdvYWwgaXMgdG8KY3JlYXRlIE1ha2VmaWxl cyAob3IgZXF1aXZhbGVudCksIHdoaWNoIHdpbGwgdGhlbiBiZSB1c2VkIHRvIGNvbXBpbGUg dGhlCnByb2plY3QuCkR1cmluZyB0aGlzIHBoYXNlLCBzb21lIG9wdGlvbnMgYXJlIHNldCwg c3VjaCBhcyB3aGV0aGVyIHRoZSBwcm9qZWN0IGlzCmNvbXBpbGVkIGluIGRlYnVnIG9yIHJl bGVhc2UgbW9kZSwgd2hpY2ggZmlsZXMgbmVlZCB0byBiZSBjb21waWxlZCwKb3IgY29tcGls ZS10aW1lIHZhbHVlcy4KClRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGljaCBidWlsZCBzeXN0 ZW1zIGFyZSBhdmFpbGFibGUgYXQgdGhlIHByb2plY3Qgcm9vdCwKb3IgYXQgRElSRUNUT1JZ IGlmIHNldC4gIERJUkVDVE9SWSBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8g dGhlCnByb2plY3Qgcm9vdC4KSXQgdGhlbiBhc2tzIHRvIHNlbGVjdCBhIGJ1aWxkIHN5c3Rl bSwgYW5kIGZpbmFsbHkgdG8gY2hvc2UgYW4gYXZhaWxhYmxlCmluc3RydWN0aW9uIGZyb20g dGhlIGJ1aWxkIHN5c3RlbS4iCiAgKGludGVyYWN0aXZlKQogIChsZXQqICgoYnVpbGQtc3lz dGVtLWlkCiAgICAgICAgICAoYnVpbGRlci1kZXRlY3QtYnVpbGQtc3lzdGVtIGRpcmVjdG9y eSkpCiAgICAgICAgIChzZWxlY3RlZC1uYW1lIG5pbCkKICAgICAgICAgKGluc3RydWN0aW9u LWxpc3QKICAgICAgICAgIChidWlsZGVyLS1nZXQtaW5zdHJ1Y3Rpb24tbGlzdCBidWlsZC1z eXN0ZW0taWQgOmNvbmZpZ3VyZSkpCiAgICAgICAgIChpbnN0cnVjdGlvbiBuaWwpKQogICAg KGlmIGJ1aWxkLXN5c3RlbS1pZAogICAgICAgIChwcm9nbiAoc2V0cSBzZWxlY3RlZC1uYW1l IChidWlsZGVyLS1zZWxlY3QtaW5zdHJ1Y3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW5zdHJ1Y3Rpb24tbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoY29uY2F0ICJTZWxlY3QgdHlwZSBvZiBjb25maWd1cmF0aW9uIGZvciAi CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQtc3lz dGVtLWlkICI6IikpKQogICAgICAgICAgICAgICAoc2V0cSBpbnN0cnVjdGlvbiAoYnVpbGRl ci0tZmluZC1pbi1saXN0LW9mLXBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpbnN0cnVjdGlvbi1saXN0IHNlbGVjdGVkLW5hbWUKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDpuYW1lKSkKICAgICAgICAgICAgICAgKGxldCAoKGNvbXBpbGF0 aW9uLWJ1ZmZlci1uYW1lLWZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICA7OyBIb3cg ZG9lcyB0aGlzIGV2ZW4gd29yaz8/CiAgICAgICAgICAgICAgICAgICAgICA7OyBJc24ndCBs ZXhpY2FsIGJpbmRpbmcgc3VwcG9zZWQgdG8gcHJldmVudCB0aGF0PwogICAgICAgICAgICAg ICAgICAgICAgKGJ1aWxkZXItY29tcGlsYXRpb24tYnVmZmVyLW5hbWUtZnVuY3Rpb24tY3Jl YXRvcgogICAgICAgICAgICAgICAgICAgICAgIDp0eXBlICJjb25maWd1cmUiCiAgICAgICAg ICAgICAgICAgICAgICAgOmJ1aWxkLXN5c3RlbS1pZCBidWlsZC1zeXN0ZW0taWQKICAgICAg ICAgICAgICAgICAgICAgICA6bmFtZSBzZWxlY3RlZC1uYW1lKSkpCiAgICAgICAgICAgICAg ICAgKGJ1aWxkZXItLWV4ZWN1dGUtY29tbWFuZAogICAgICAgICAgICAgICAgICA6aW5zdHJ1 Y3Rpb24gaW5zdHJ1Y3Rpb24KICAgICAgICAgICAgICAgICAgOmRpcmVjdG9yeSBkaXJlY3Rv cnkpKSkKICAgICAgKG1lc3NhZ2UgIk5vIGtub3duIGJ1aWxkIHN5c3RlbSBkZXRlY3RlZCIp KSkpCgoKOzsgU2hvdWxkIGJ1aWxkZXItY29tcGlsZSBhbmQgYnVpbGRlci1jb25maWd1cmUg ZXhpc3RzPwo7OyBTaG91bGQgdGhleSBiZSBvbmUgZnVuY3Rpb24gd2l0aCBvbmUgcGFyYW1l dGVyPyBXaHk/IFdoeSBub3Q/Cjs7IEFyZ3VlbWVudHMgZm9yIGtlZXBpbmcgdGhlbSBzZXBh cmF0ZWQ6Cjs7IC0gQ2FuIGNoYW5nZSBvbmUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG90aGVy Cjs7IC0gVGhlcmUgaXMgbm90IGEgbG90IG9mIGxvZ2ljIGluc2lkZSBhbnl3YXksIHdvdWxk IG1lcmdpbmcgdGhlbSBiZSBhY3R1YWxseSB1c2VmdWw/Cjs7IEFyZ3VtZW50cyBhZ2FpbnRz Ogo7OyAtIER1cGxpY2F0aW9uIG9mIGxvZ2ljCjs7IC0gQ3JlYXRpbmcgYSBuZXcgb25lIHJl cXVpcmUgdG8gY29weSB0aGUgY29kZS4gRm9yIGluc3RhbmNlLCBwcm9qZWN0aWxlIGhhcyA1 Cjs7ICAgcmVsZXZhbnQgZnVuY3Rpb25zLCBjb25maWd1cmUsIGNvbXBpbGUsIHBhY2thZ2Us IGluc3RhbGwsIHRlc3QgKGFuZCBydW4sCjs7ICAgYnV0IHRoaXMgaXMgYSBzcGVjaWFsIGNh c2UpLiBLZWVwaW5nIGZpdmUgY29waWVzIG9mIHZpcnR1YWxseSB0aGUgc2FtZQo7OyAgIGZ1 bmN0aW9uIHNlZW1zIGEgYmFkIGlkZWEuCjs7OyMjI2F1dG9sb2FkCihkZWZ1biBidWlsZGVy LWNvbXBpbGUgKCZvcHRpb25hbCBkaXJlY3RvcnkpCiAgIkNvbXBpbGUgdGhlIHByb2plY3Qu ClRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGljaCBidWlsZCBzeXN0ZW1zIGFyZSBhdmFpbGFi bGUgYXQgdGhlIHByb2plY3Qgcm9vdCwKb3IgYXQgRElSRUNUT1JZIGlmIG5vbi1uaWwuCkl0 IHRoZW4gYXNrcyB0byBzZWxlY3QgYSBidWlsZCBzeXN0ZW0sIGFuZCB0aGVuIHRvIGNob3Nl IGFuIGF2YWlsYWJsZQppbnN0cnVjdGlvbiBmcm9tIHRoZSBidWlsZCBzeXN0ZW0uIgogIChp bnRlcmFjdGl2ZSkKICAobGV0KiAoKGJ1aWxkLXN5c3RlbS1pZAogICAgICAgICAgKGJ1aWxk ZXItZGV0ZWN0LWJ1aWxkLXN5c3RlbSBkaXJlY3RvcnkpKQogICAgICAgICAoc2VsZWN0ZWQt bmFtZSBuaWwpCiAgICAgICAgIChpbnN0cnVjdGlvbi1saXN0CiAgICAgICAgICAoYnVpbGRl ci0tZ2V0LWluc3RydWN0aW9uLWxpc3QgYnVpbGQtc3lzdGVtLWlkIDpjb21waWxlKSkKICAg ICAgICAgKGluc3RydWN0aW9uIG5pbCkpCiAgICAoaWYgYnVpbGQtc3lzdGVtLWlkCiAgICAg ICAgKHByb2duKHNldHEgc2VsZWN0ZWQtbmFtZSAoYnVpbGRlci0tc2VsZWN0LWluc3RydWN0 aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24tbGlz dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgIlNlbGVjdCB0 eXBlIG9mIGNvbXBpbGF0aW9uIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBidWlsZC1zeXN0ZW0taWQgIjoiKSkpCiAgICAgICAgICAgICAgKHNl dHEgaW5zdHJ1Y3Rpb24gKGJ1aWxkZXItLWZpbmQtaW4tbGlzdC1vZi1wbGlzdAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi1saXN0IHNlbGVjdGVkLW5h bWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm5hbWUpKQogICAgICAgICAg ICAgIChsZXQgKChjb21waWxhdGlvbi1idWZmZXItbmFtZS1mdW5jdGlvbgogICAgICAgICAg ICAgICAgICAgICA7OyBIb3cgZG9lcyB0aGlzIGV2ZW4gd29yaz8/CiAgICAgICAgICAgICAg ICAgICAgIDs7IElzbid0IGxleGljYWwgYmluZGluZyBzdXBwb3NlZCB0byBwcmV2ZW50IHRo YXQ/CiAgICAgICAgICAgICAgICAgICAgIChidWlsZGVyLWNvbXBpbGF0aW9uLWJ1ZmZlci1u YW1lLWZ1bmN0aW9uLWNyZWF0b3IKICAgICAgICAgICAgICAgICAgICAgIDp0eXBlICJjb21w aWxlIgogICAgICAgICAgICAgICAgICAgICAgOmJ1aWxkLXN5c3RlbS1pZCBidWlsZC1zeXN0 ZW0taWQKICAgICAgICAgICAgICAgICAgICAgIDpuYW1lIHNlbGVjdGVkLW5hbWUpKSkKICAg ICAgICAgICAgICAgIChidWlsZGVyLS1leGVjdXRlLWNvbW1hbmQKICAgICAgICAgICAgICAg ICA6aW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24KICAgICAgICAgICAgICAgICA6ZGlyZWN0b3J5 IGRpcmVjdG9yeSkpKQogICAgICAobWVzc2FnZSAiTm8ga25vd24gYnVpbGQgc3lzdGVtIGRl dGVjdGVkIikpKSkKCgwKOzsgQnVpbGQgc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucwoKKGNs LWRlZnVuIGJ1aWxkZXItLW1lc29uLWNvbmZpZ3VyZS1tb2RpZnktY29tbWFuZCAoY29tbWFu ZCBkaXJlY3RvcnkpCiAgIklmIE1lc29uIGlzIGFscmVhZHkgY29uZmlndXJlZCwgYXBwZW5k IFwiLS1yZWNvbmZpZ3VyZVwiIHRvIENPTU1BTkQuCkl0IGNoZWNrcyBpbiB0aGUgYnVpbGQg ZGlyZWN0b3J5LCB0aGUgY2hpbGQgb2YgRElSRUNUT1JZLCBpZiB0aGUgZmlsZQpcIm1lc29u LXByaXZhdGVcIiBleGlzdHMuICBESVJFQ1RPUlkgaXMgZWl0aGVyIGFic29sdXRlIG9yIHJl bGF0aXZlCnRvIHRoZSBwcm9qZWN0IHJvb3QuIgogIChsZXQgKChidWlsZC1kaXItYWJzb2x1 dGUtbmFtZSAoYnVpbGRlci0tZ2V0LWJ1aWxkLWRpci1uYW1lLWFic29sdXRlIGRpcmVjdG9y eSkpKQogICAgKGlmIChmaWxlLWRpcmVjdG9yeS1wIChleHBhbmQtZmlsZS1uYW1lICJtZXNv bi1wcml2YXRlIiBidWlsZC1kaXItYWJzb2x1dGUtbmFtZSkpCiAgICAgICAgKGNvbmNhdCBj b21tYW5kICIgLS1yZWNvbmZpZ3VyZSIpCiAgICAgIGNvbW1hbmQpKSkKCgooZGVmdW4gYnVp bGRlci0tY21ha2UtcHJlc2V0cy1tb2RpZnktY29tbWFuZCAoY29tbWFuZCBkaXJlY3Rvcnkp CiAgIkFzayB0aGUgdXNlciB0byBjaG9zZSBhIHByZXNldCBmcm9tIHRoZSBmaWxlIFwiQ01h a2VQcmVzZXRzLmpzb25cIi4KSXQgYXBwZW5kcyBcIi0tcHJlc2V0PVBSRVNFVFwiIHRvIENP TU1BTkQsIHdpdGggUFJFU0VUIGJlaW5nIHRoZQpzZWxlY3RlZCBwcmVzZXQuCkl0IGxvb2tz IGZvciB0aGUgZmlsZSBcIkNtYWtlUHJlc2V0cy5qc29uXCIgYXQgRElSRUNUT1JZLiAgRElS RUNUT1JZIGlzIGVpdGhlcgogYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qg cm9vdC4iCiAgKGxldAogICAgICAoKGNtYWtlLXByZXNldHMtZGlyZWN0b3J5CiAgICAgICAg KGV4cGFuZC1maWxlLW5hbWUKICAgICAgICAgIkNNYWtlUHJlc2V0cy5qc29uIgogICAgICAg ICAob3IgZGlyZWN0b3J5CiAgICAgICAgICAgICAocHJvamVjdC1yb290IChwcm9qZWN0LWN1 cnJlbnQpKSkpKQogICAgICAgKHNlbGVjdGlvbmVkLXByZXNldCBuaWwpKQogICAgKHNldHEg c2VsZWN0aW9uZWQtcHJlc2V0CiAgICAgICAgICAod2hlbgogICAgICAgICAgICAgIChhbmQK ICAgICAgICAgICAgICAgKGpzb24tYXZhaWxhYmxlLXApCiAgICAgICAgICAgICAgIChmaWxl LWV4aXN0cy1wIGNtYWtlLXByZXNldHMtZGlyZWN0b3J5KSkKICAgICAgICAgICAgKGxldAog ICAgICAgICAgICAgICAgKChwcmVzZXRzLWNvbnRlbnQKICAgICAgICAgICAgICAgICAgKHdp dGgtdGVtcC1idWZmZXIKICAgICAgICAgICAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVu dHMgY21ha2UtcHJlc2V0cy1kaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgKGdvdG8t Y2hhcgogICAgICAgICAgICAgICAgICAgICAocG9pbnQtbWluKSkKICAgICAgICAgICAgICAg ICAgICAoanNvbi1yZWFkKSkpCiAgICAgICAgICAgICAgICAgKHByZXNldHMtdGFibGUgKG1h a2UtaGFzaC10YWJsZSkpKQogICAgICAgICAgICAgIChzZXEtZG9zZXEKICAgICAgICAgICAg ICAgICAgKHByZXNldC1uYW1lCiAgICAgICAgICAgICAgICAgICAoY2RyCiAgICAgICAgICAg ICAgICAgICAgKGFzc29jICdjb25maWd1cmVQcmVzZXRzIHByZXNldHMtY29udGVudCkpKQog ICAgICAgICAgICAgICAgKHB1dGhhc2gKICAgICAgICAgICAgICAgICAoY2RyIChhc3NvYyAn bmFtZSBwcmVzZXQtbmFtZSkpCiAgICAgICAgICAgICAgICAgKGNkciAoYXNzb2MgJ2Rpc3Bs YXlOYW1lIHByZXNldC1uYW1lKSkKICAgICAgICAgICAgICAgICBwcmVzZXRzLXRhYmxlKSkK ICAgICAgICAgICAgICAod2hlbiAobm90IChoYXNoLXRhYmxlLWVtcHR5LXAgcHJlc2V0cy10 YWJsZSkpCiAgICAgICAgICAgICAgICAoY29tcGxldGluZy1yZWFkICJTZWxlY3QgcHJlc2V0 OiAiIHByZXNldHMtdGFibGUgbmlsIHQpKSkpKQogICAgKGlmIHNlbGVjdGlvbmVkLXByZXNl dAogICAgICAgIChjb25jYXQgY29tbWFuZCAiIC0tcHJlc2V0PSIgc2VsZWN0aW9uZWQtcHJl c2V0KQogICAgICAoZXJyb3IgIk5vIHByZXNldCBzZWxlY3RlZCIpKSkpCgoKKGRlZnVuIGJ1 aWxkZXItLWR1bmUtbW9kaWZ5LWNvbW1hbmQtY29tcGlsZSAoY29tbWFuZCBkaXJlY3Rvcnkp CiAgIkFzayB1c2VyIHRvIGNob3NlIGEgZHVuZSB0YXJnZXQuCkl0IHJlY3Vyc2l2ZWx5IHJl YWRzIHRoZSBkdW5lIGZpbGVzIGluc2lkZSBcImJpblwiIGxvY2F0ZWQgaW5zaWRlIERJUkVD VE9SWSB0bwogZmluZCB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4gIEVhY2ggZHVuZSBm aWxlIGNvbnRhaW5zIGNhbiBjb250YWluIGF0IG1vc3QKb25lIHBhcmFtZXRlciBcImV4ZWN1 dGFibGVcIiB4b3IgKGV4Y2x1c2l2ZSBvcikgXCJleGVjdXRhYmxlc1wiLgpJdCB0aGVuIHJl YWRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW10ZXIgXCJuYW1lXCIgKHJlc3AuIFwibmFtZXNc IikuCkNPTU1BTkQgaXMgdGhlIGNvbW1hbmQgdG8gbW9kaWZ5LgpUT0RPOiBhZGQgYSBzZXR0 aW5nIHRvIGNoYW5nZSB0aGUgZGlyZWN0b3J5LCBhcyBcImJpblwiIG1heSBub3QgYmUKdGhl IHJpZ2h0IGRpcmVjdG9yeS4iCiAgKGxldCogKCh3b3JraW5nLWRpcmVjdG9yeSAoYnVpbGRl ci0tZ2V0LWJ1aWxkLWRpci1wYXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk aXJlY3RvcnkpKQogICAgICAgICAoc291cmNlLWRpciAoZXhwYW5kLWZpbGUtbmFtZQogICAg ICAgICAgICAgICAgICAgICAgImJpbiIKICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmct ZGlyZWN0b3J5KSkKICAgICAgICAgKGNhbmRpZGF0ZXMgKCkpKQogICAgKGRvbGlzdCAoZHVu ZS1maWxlIChkaXJlY3RvcnktZmlsZXMtcmVjdXJzaXZlbHkgc291cmNlLWRpciAiXmR1bmUk IikpCiAgICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgKGluc2VydCAiKHByb2duICIp CiAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIGR1bmUtZmlsZSkKICAgICAgICAoZ290 by1jaGFyIChwb2ludC1tYXgpKQogICAgICAgIChpbnNlcnQgIikiKQogICAgICAgIChnb3Rv LWNoYXIgKHBvaW50LW1pbikpCiAgICAgICAgKGxldCogKChjb250ZW50IChjZHIgKHJlYWQg KGN1cnJlbnQtYnVmZmVyKSkpKQogICAgICAgICAgICAgICAoc2V4cCBuaWwpCiAgICAgICAg ICAgICAgIChyZXMgbmlsKSkKICAgICAgICAgICh3aGlsZSAoYW5kIChzZXRxIHNleHAgKGNh YXIgY29udGVudCkpIChub3QgcmVzKSkKICAgICAgICAgICAgKGNvbmQKICAgICAgICAgICAg ICgoZXEgJ2V4ZWN1dGFibGUgc2V4cCkKICAgICAgICAgICAgICAoY2wtcHVzaG5ldwogICAg ICAgICAgICAgICAoZmlsZS1yZWxhdGl2ZS1uYW1lCiAgICAgICAgICAgICAgICAoZmlsZS1u YW1lLWNvbmNhdAogICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtcGFyZW50LWRpcmVjdG9y eSBkdW5lLWZpbGUpCiAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAgICAgICAgICAgICAg ICAoc3ltYm9sLW5hbWUgKGNhciAoYWxpc3QtZ2V0ICduYW1lIChjZGFyIGNvbnRlbnQpKSkp CiAgICAgICAgICAgICAgICAgICIuZXhlIikpCiAgICAgICAgICAgICAgICB3b3JraW5nLWRp cmVjdG9yeSkKICAgICAgICAgICAgICAgY2FuZGlkYXRlcykpCiAgICAgICAgICAgICAoKGVx ICdleGVjdXRhYmxlcyBzZXhwKQogICAgICAgICAgICAgIChzZXRxIGNhbmRpZGF0ZXMKICAg ICAgICAgICAgICAgICAgICAoYXBwZW5kIGNhbmRpZGF0ZXMKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChtYXBjYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRh IChuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGUtcmVsYXRpdmUt bmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtY29uY2F0 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLW5hbWUtcGFyZW50LWRp cmVjdG9yeSBkdW5lLWZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChj b25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICIuZXhlIikpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgd29ya2luZy1kaXJlY3RvcnkpKQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChtYXBjYXIgIydzeW1ib2wtbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGFsaXN0LWdldCAnbmFtZXMgKGNkYXIgY29udGVudCkpKSkpKSkpCiAg ICAgICAgICAgIChzZXRxIGNvbnRlbnQgKGNkciBjb250ZW50KSkpKSkpCiAgICAoY29uY2F0 CiAgICAgY29tbWFuZAogICAgICh3aGVuIGNhbmRpZGF0ZXMKICAgICAgIChsZXQgKChjaG9p Y2UKICAgICAgICAgICAgICAoc2hlbGwtcXVvdGUtYXJndW1lbnQKICAgICAgICAgICAgICAg KGNvbXBsZXRpbmctcmVhZCAiU2VsZWN0IHRhcmdldDoiCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGNvbnMgImFsbCIgY2FuZGlkYXRlcykKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBuaWwgdCkpKSkKICAgICAgICAgKGlmIChub3QgKHN0cmluZy1lcXVh bCAiYWxsIiBjaG9pY2UpKQogICAgICAgICAgICAgKGNvbmNhdCAiICIgY2hvaWNlKSkpKSkp KQoKCgoMCjs7IEFkZCBidWlsZCBzeXN0ZW1zCgooYnVpbGRlci1hZGQtYnVpbGQtc3lzdGVt CiA6YnVpbGQtc3lzdGVtLWlkICJjbWFrZSIKIDpjb25maWd1cmUgJyg6aW5zaWRlLWRpcmVj dG9yeSB0CiAgICAgICAgICAgICAgOmluc3RydWN0aW9ucwogICAgICAgICAgICAgICgoOm5h bWUgInJlbGVhc2UiCiAgICAgICAgICAgICAgICA6Y29tbWFuZCAiY21ha2UgLi4gLURDTUFL RV9CVUlMRF9UWVBFPXJlbGVhc2UgLURDTUFLRV9FWFBPUlRfQ09NUElMRV9DT01NQU5EUz1P TiIpCiAgICAgICAgICAgICAgKDpuYW1lICJkZWJ1ZyIKICAgICAgICAgICAgICAgOmNvbW1h bmQgImNtYWtlIC4uIC1EQ01BS0VfQlVJTERfVFlQRT1kZWJ1ZyAtRENNQUtFX0VYUE9SVF9D T01QSUxFX0NPTU1BTkRTPU9OIikpKQogOmNvbXBpbGUgJyg6aW5zdHJ1Y3Rpb25zCiAgICAg ICAgICAgICgoOm5hbWUgInBhcmFsbGVsIgogICAgICAgICAgICAgIDpjb21tYW5kICJjbWFr ZSAtLWJ1aWxkICViIC0tcGFyYWxsZWwgJW4iKSkpKQoKKGJ1aWxkZXItYWRkLWJ1aWxkLXN5 c3RlbQogOmJ1aWxkLXN5c3RlbS1pZCAibWVzb24iCiA6Y29uZmlndXJlICcoOmluc3RydWN0 aW9ucwogICAgICAgICAgICAgICgoOm5hbWUgInJlbGVhc2UiCiAgICAgICAgICAgICAgICA6 Y29tbWFuZCAibWVzb24gc2V0dXAgJWIgLS1idWlsZHR5cGU9cmVsZWFzZSIpCiAgICAgICAg ICAgICAgICg6bmFtZSAiZGVidWciCiAgICAgICAgICAgICAgICA6Y29tbWFuZCAibWVzb24g c2V0dXAgJWIgLS1idWlsZHR5cGU9ZGVidWciKSkKICAgICAgICAgICAgICA6ZnVuY3Rpb24t bW9kaWZpY2F0aW9uIGJ1aWxkZXItLW1lc29uLWNvbmZpZ3VyZS1tb2RpZnktY29tbWFuZCkK IDpjb21waWxlICcoOmluc3RydWN0aW9ucwogICAgICAgICAgICAoKDpuYW1lICJkZWZhdWx0 IgogICAgICAgICAgICAgIDpjb21tYW5kICJtZXNvbiBjb21waWxlIC1DICViIikpKSkKCgoo YnVpbGRlci1hZGQtYnVpbGQtc3lzdGVtCiA6YnVpbGQtc3lzdGVtLWlkICJjbWFrZS1wcmVz ZXRzIgogOmNvbmZpZ3VyZSAnKDppbnN0cnVjdGlvbnMKICAgICAgICAgICAgICAoKDpuYW1l ICJkZWZhdWx0IgogICAgICAgICAgICAgICAgOmNvbW1hbmQgImNtYWtlIikpCiAgICAgICAg ICAgICAgOmZ1bmN0aW9uLW1vZGlmaWNhdGlvbiBidWlsZGVyLS1jbWFrZS1wcmVzZXRzLW1v ZGlmeS1jb21tYW5kKQogOmNvbXBpbGUgJyg6aW5zdHJ1Y3Rpb25zCiAgICAgICAgICAgICgo Om5hbWUgInBhcmFsbGVsIgogICAgICAgICAgICAgIDpjb21tYW5kICJjbWFrZSAtLWJ1aWxk ICViIC0tcGFyYWxsZWwgJW4iKSkpKQoKCihidWlsZGVyLWFkZC1idWlsZC1zeXN0ZW0KIDpi dWlsZC1zeXN0ZW0taWQgImF1dG90b29scyIKIDpjb25maWd1cmUgJyg6aW5zdHJ1Y3Rpb25z CiAgICAgICAgICAgICAgKCg6bmFtZSAiY29uZmlndXJlIgogICAgICAgICAgICAgICAgOmNv bW1hbmQgIi4uL2NvbmZpZ3VyZSIKICAgICAgICAgICAgICAgIDppbnNpZGUtZGlyZWN0b3J5 IHQpCiAgICAgICAgICAgICAgICg6bmFtZSAiYXV0b2NvbmYiCiAgICAgICAgICAgICAgICA6 Y29tbWFuZCAiYXV0b2NvbmYiKSkpCiA6Y29tcGlsZSAnKDppbnN0cnVjdGlvbnMKICAgICAg ICAgICAgKCg6bmFtZSAicGFyYWxsZWwiCiAgICAgICAgICAgICAgOmNvbW1hbmQgIm1ha2Ug LWolbiIpKQogICAgICAgICAgICA6aW5zaWRlLWRpcmVjdG9yeSB0KSkKCgooYnVpbGRlci1h ZGQtYnVpbGQtc3lzdGVtCiA6YnVpbGQtc3lzdGVtLWlkICJtYWtlIgogOmNvbXBpbGUgJyg6 aW5zdHJ1Y3Rpb25zCiAgICAgICAgICAgICgoOm5hbWUgInBhcmFsbGVsIgogICAgICAgICAg ICAgIDpjb21tYW5kICJtYWtlIC1qJW4iKSkpKQoKKGJ1aWxkZXItYWRkLWJ1aWxkLXN5c3Rl bQogOmJ1aWxkLXN5c3RlbS1pZCAiY2FyZ28iCiA6Y29tcGlsZSAnKDppbnN0cnVjdGlvbnMK ICAgICAgICAgICAgKCg6bmFtZSAicmVsZWFzZSIKICAgICAgICAgICAgICA6Y29tbWFuZCAi Y2FyZ28gYnVpbGQgLS1yZWxlYXNlIikKICAgICAgICAgICAgICg6bmFtZSAiZGVidWciCiAg ICAgICAgICAgICAgOmNvbW1hbmQgImNhcmdvIGJ1aWxkIikpKSkKCihidWlsZGVyLWFkZC1i dWlsZC1zeXN0ZW0KIDpidWlsZC1zeXN0ZW0taWQgImR1bmUiCiA6Y29tcGlsZSAnKDppbnN0 cnVjdGlvbnMKICAgICAgICAgICAgKCg6bmFtZSAiY29tcGlsZSIKICAgICAgICAgICAgICA6 Y29tbWFuZCAiZHVuZSBidWlsZCIKICAgICAgICAgICAgICA6ZnVuY3Rpb24tbW9kaWZpY2F0 aW9uIGJ1aWxkZXItLWR1bmUtbW9kaWZ5LWNvbW1hbmQtY29tcGlsZSkpKSkKCgoocHJvdmlk ZSAnYnVpbGRlcikKOzs7IGJ1aWxkZXIuZWwgZW5kcyBoZXJlCg== --------------PVNIFZb1DJRbCkTqrRVUEHyN Content-Type: text/x-emacs-lisp; charset=UTF-8; name="dir-var.el" Content-Disposition: attachment; filename="dir-var.el" Content-Transfer-Encoding: base64 Ozs7IGRpci12YXIuZWwgLS0tIERpcmVjdG9yeSB2YXJpYWJsZXMgLSotIGxleGljYWwtYmlu ZGluZzogdDsgLSotCgo7OzsgQ29weXJpZ2h0IChDKSAyMDIzICBCVHVpbgo7OzsgVmVyc2lv bjogMC4xCjs7OyBQYWNrYWdlLVJlcXVpcmVzOiAoKGVtYWNzICIyOC4xIikpCjs7OyBIb21l cGFnZTogaHR0cHM6Ly9naXRsYWIuY29tL2J0dWluMi9idWlsZGVyCgo7OyBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQo7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgo7OyAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgoKOzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCjs7IE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K Cjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7IENvbW1lbnRhcnk6Cjs7 OyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgcHJvamVjdCB2YXJpYWJsZXMuCgo7OzsgQ29kZToK CgoocmVxdWlyZSAncHJvamVjdCkKKHJlcXVpcmUgJ21hcCkKKHJlcXVpcmUgJ2NsLWxpYikK CgooZGVmdmFyIGRpci12YXItLXRhYmxlIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgJ2VxdWFs KSkKCihkZWZjdXN0b20gZGlyLXZhci1maWxlLW5hbWUgImVtYWNzLXByb2plY3QtdmFyaWFi bGVzLWNhY2hlLmVsIgogICJOYW1lIG9mIGZpbGUgaW4gd2hpY2ggcHJvamVjdCB2YXJpYWJs ZSBhcmUgd3JpdHRlbi4iCiAgOnR5cGUgJ2ZpbGUKICA6Z3JvdXAgJ2J1aWxkZXIpCgoKCihk ZWZ2YXIgZGlyLXZhci0tdHJlZSAnKCIiIG5pbCkpCgo7OyBub2RlIHN0cnVjdHVyZSA6IChu YW1lIGxpc3Qtb2Ytc3Vibm9kZXMgcGxpc3Qtb2YtdmFyaWFibGVzLXdpdGgtdmFsdWVzKQoK KGRlZnVuIGRpci12YXItLW1ha2Utbm9kZSAoaWQgJm9wdGlvbmFsIHN1Ym5vZGVzIHZhcmlh YmxlcykKICAiQ3JlYXRlIGEgbm9kZS4KSUQgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIG5v ZGUsIGEgc3RyaW5nLgpTVUJOT0RFUyBpZiBhIGxpc3Qgb2Ygbm9kZXMuClZBUklBQkxFUyBp cyBhIHBsaXN0LCB0aGUgcHJvcGVydGllcyBhcmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxl IChhIHN5bWJvbCkKIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGVpciB2YWx1ZS4iCiAgKGNvbnMg aWQgKGNvbnMgc3Vibm9kZXMgdmFyaWFibGVzKSkpCgooZGVmdW4gZGlyLXZhci0tZ2V0LW5v ZGUtc3Vibm9kZXMgKG5vZGUpCiAgIlJldHVybiB0aGUgc3Vibm9kZXMgb2YgTk9ERS4iCiAg KGNhZHIgbm9kZSkpCgooZGVmdW4gZGlyLXZhci0tZ2V0LW5vZGUtbmFtZSAobm9kZSkKICAi UmV0dXJuIHRoZSBuYW1lIG9mIE5PREUgKGl0cyBJRCkuIgogIChjYXIgbm9kZSkpCgooZGVm dW4gZGlyLXZhci0tZ2V0LW5vZGUtdmFyaWFibGVzIChub2RlKQogICJSZXR1cm4gdGhlIHBs aXN0IGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlcyBvZiBOT0RFLiIKICAoY2FkZHIgbm9kZSkp CgooZGVmdW4gZGlyLXZhci0tbm9kZS1lcXVhbC1wIChub2RlMSBub2RlMikKICAiQ2hlY2sg aWYgdGhlIG5vZGVzIE5PREUxIGFuZCBOT0RFMiBhcmUgZXF1YWwuClR3byBub2RlcyBhcmUg ZXF1YWwgd2hlbiB0aGVpciBuYW1lcyBhcmUgZXF1YWwuIgogIChzdHJpbmctZXF1YWwgKGRp ci12YXItLWdldC1ub2RlLW5hbWUgbm9kZTEpCiAgICAgICAgICAgICAgICAoZGlyLXZhci0t Z2V0LW5vZGUtbmFtZSBub2RlMikpKQoKKGRlZnVuIGRpci12YXItLWZpbmQtc3Vibm9kZSAo bm9kZSBuYW1lKQogICJGaW5kIGEgc3Vibm9kZSBpbiB0aGUgbGlzdCBvZiBzdWJub2RlcyBv ZiBOT0RFLgpOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzdWJub2RlIHRvIGZpbmQuIgogIChz ZXEtZmluZCAobGFtYmRhICh4KQogICAgICAgICAgICAgIChzdHJpbmctZXF1YWwgKGRpci12 YXItLWdldC1ub2RlLW5hbWUgeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUp KQogICAgICAgICAgICAoZGlyLXZhci0tZ2V0LW5vZGUtc3Vibm9kZXMgbm9kZSkpKQoKCihk ZWZ1biBkaXItdmFyLS1pbnNlcnQtbm9kZS1pbi1wYXJlbnQgKHBhcmVudC1ub2RlIG5vZGUp CiAgIkluc2VydCBOT0RFIGluIFBBUkVOVC1OT0RFIHN1Ym5vZGVzIGxpc3QuIgogIChsZXQg KChzdWJub2RlcyAoZGlyLXZhci0tZ2V0LW5vZGUtc3Vibm9kZXMgcGFyZW50LW5vZGUpKSkK ICAgIChsZXQgKChzdWJub2RlcyAoaWYgbm9kZQogICAgICAgICAgICAgICAgICAgICAgICAo Y29ucwogICAgICAgICAgICAgICAgICAgICAgICAgbm9kZQogICAgICAgICAgICAgICAgICAg ICAgICAgKGNsLXJlbW92ZS1pZiAobGFtYmRhICh4KSAoZGlyLXZhci0tbm9kZS1lcXVhbC1w IHggbm9kZSkpIHN1Ym5vZGVzKSkKICAgICAgICAgICAgICAgICAgICAgIHN1Ym5vZGVzKSkp CiAgICAgIChzZXRmIHBhcmVudC1ub2RlIChkaXItdmFyLS1tYWtlLW5vZGUKICAgICAgICAg ICAgICAgICAgICAgICAgIChkaXItdmFyLS1nZXQtbm9kZS1uYW1lIHBhcmVudC1ub2RlKQog ICAgICAgICAgICAgICAgICAgICAgICAgc3Vibm9kZXMKICAgICAgICAgICAgICAgICAgICAg ICAgIChkaXItdmFyLS1nZXQtbm9kZS12YXJpYWJsZXMgcGFyZW50LW5vZGUpKSkpKSkKCgoo ZGVmdW4gZGlyLXZhci0tc2V0LW5vZGUtdmFyaWFibGUgKG5vZGUgdmFyaWFibGUgdmFsdWUp CiAgIlJldHVybiBOT0RFIHdpdGggdGhlIHZhcmlhYmxlIFZBUklBQkxFIHNldCB0byBWQUxV RS4iCiAgKGxldCAoKHZhcmlhYmxlLXBsaXN0IChkaXItdmFyLS1nZXQtbm9kZS12YXJpYWJs ZXMgbm9kZSkpKQogICAgKGRpci12YXItLW1ha2Utbm9kZQogICAgIChkaXItdmFyLS1nZXQt bm9kZS1uYW1lIG5vZGUpCiAgICAgKGRpci12YXItLWdldC1ub2RlLXN1Ym5vZGVzIG5vZGUp CiAgICAgKGxpc3QgKHBsaXN0LXB1dCB2YXJpYWJsZS1wbGlzdCB2YXJpYWJsZSB2YWx1ZSkp KSkpCgoKKGRlZnVuIGRpci12YXItLWdldC1ub2RlLXZhcmlhYmxlLXZhbHVlIChub2RlIHZh cmlhYmxlKQogICJHZXQgdGhlIHZhbHVlIG9mIFZBUklBQkxFIHN0b3JlZCBpbiBOT0RFLiIK ICAocGxpc3QtZ2V0IChkaXItdmFyLS1nZXQtbm9kZS12YXJpYWJsZXMgbm9kZSkgdmFyaWFi bGUpKQoKCihkZWZ1biBkaXItdmFyLS1ub2RlLXZhcmlhYmxlLWV4aXN0cy1wIChub2RlIHZh cmlhYmxlKQogICJSZXR1cm4gbm9uLW5pbCBpZiBWQVJJQUJMRSBpcyBzdG9yZWQgaW4gTk9E RS4iCiAgKHBsaXN0LW1lbWJlciAoZGlyLXZhci0tZ2V0LW5vZGUtdmFyaWFibGVzIG5vZGUp IHZhcmlhYmxlKSkKCihkZWZ1biBkaXItdmFyLS1yZW1vdmUtbm9kZS12YXJpYWJsZSAobm9k ZSB2YXJpYWJsZSkKICAiUmV0dXJuIE5PREUgd2l0aG91dCB0aGUgdmFyaWFibGUgVkFSSUFC TEUuIgogIChsZXQgKCh2YXJpYWJsZS1wbGlzdCAoZGlyLXZhci0tZ2V0LW5vZGUtdmFyaWFi bGVzIG5vZGUpKSkKICAgIChkaXItdmFyLS1tYWtlLW5vZGUKICAgICAoZGlyLXZhci0tZ2V0 LW5vZGUtbmFtZSBub2RlKQogICAgIChkaXItdmFyLS1nZXQtbm9kZS1zdWJub2RlcyBub2Rl KQogICAgKGxpc3QgKG1hcC1kZWxldGUgdmFyaWFibGUtcGxpc3QgdmFyaWFibGUpKSkpKQoK CihkZWZ1biBkaXItdmFyLS1pbnNlcnQtdmFyaWFibGUgKHJvb3QgZGlyLXNwbGl0IHZhcmlh YmxlIHZhbHVlKQogICJSZXR1cm4gYSBuZXcgdHJlZSB3aXRoIHRoZSB2YXJpYWJsZSBpbnNl cnRlZC4KUk9PVCBpcyB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlLgpESVItU1BMSVQgaXMg YSBsaXN0IG9mIHN0cmluZy4gIEl0IGlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGRpcmVjdG9y eQpzcGxpdHRlZCBhIGVhY2ggZmlsZSBzZXBhcmF0b3IuICBGb3IgZXhhbXBsZSwgb24gVU5J WCBzeXN0ZW1zLCB0aGUKY29ycmVzcG9uZGluZyBzcGxpdHRlZCBwYXRoIG9mIFwiL2hvbWUv dXNlci9wcm9qZWN0L3NvdXJjZVwiIGlzCnRoZSBsaXN0IChcImhvbWVcIiBcInVzZXJcIiBc InByb2plY3RcIiBcInNvdXJjZVwiKS4KVkFSSUFCTEUgaXMgdGhlIHN5bWJvbCB0byByZWZl ciB0byB0aGUgdmFyaWFibGUuClZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUu IgogIChpZiAoY2FyIGRpci1zcGxpdCkKICAgICAgKGxldCAoKHN1Ym5vZGUgKG9yCiAgICAg ICAgICAgICAgICAgICAgICAoZGlyLXZhci0tZmluZC1zdWJub2RlIHJvb3QgKGNhciBkaXIt c3BsaXQpKQogICAgICAgICAgICAgICAgICAgICAgKGRpci12YXItLW1ha2Utbm9kZSAoY2Fy IGRpci1zcGxpdCkpKSkpCiAgICAgICAgKGRpci12YXItLWluc2VydC1ub2RlLWluLXBhcmVu dAogICAgICAgICByb290CiAgICAgICAgIChkaXItdmFyLS1pbnNlcnQtdmFyaWFibGUgc3Vi bm9kZSAoY2RyIGRpci1zcGxpdCkgdmFyaWFibGUgdmFsdWUpKSkKICAgIChkaXItdmFyLS1z ZXQtbm9kZS12YXJpYWJsZSByb290IHZhcmlhYmxlIHZhbHVlKSkpCgoKKGRlZnVuIGRpci12 YXItLXZhcmlhYmxlLWdldC12YWx1ZSAocm9vdCBkaXItc3BsaXQgdmFyaWFibGUpCiAgIlJl dHVybiB0aGUgdmFsdWUgb2YgVkFSSUFCTEUuCgpST09UIGlzIHRoZSByb290IG5vZGUgb2Yg dGhlIHRyZWUKRElSLVNQTElUIGlzIGEgbGlzdCBvZiBzdHJpbmcuICBJdCBpcyB0aGUgZnVs bCBwYXRoIG9mIHRoZSBkaXJlY3RvcnkKc3BsaXR0ZWQgYSBlYWNoIGZpbGUgc2VwYXJhdG9y LiAgRm9yIGV4YW1wbGUsIG9uIFVOSVggc3lzdGVtcywgdGhlCmNvcnJlc3BvbmRpbmcgc3Bs aXR0ZWQgcGF0aCBvZiBcIi9ob21lL3VzZXIvcHJvamVjdC9zb3VyY2VcIiBpcwp0aGUgbGlz dCAoXCJob21lXCIgXCJ1c2VyXCIgXCJwcm9qZWN0XCIgXCJzb3VyY2VcIikuIgogIChsZXQg KCh2YWx1ZSBuaWwpCiAgICAgICAgKG5vZGUgcm9vdCkpCiAgICAod2hpbGUgKGFuZCBkaXIt c3BsaXQgbm9kZSkKICAgICAgKHNldHEgbm9kZSAoZGlyLXZhci0tZmluZC1zdWJub2RlIG5v ZGUgKGNhciBkaXItc3BsaXQpKSkKICAgICAgKHNldHEgdmFsdWUgKG9yIChkaXItdmFyLS1n ZXQtbm9kZS12YXJpYWJsZS12YWx1ZSBub2RlIHZhcmlhYmxlKQogICAgICAgICAgICAgICAg ICAgICAgdmFsdWUpKQogICAgICAoc2V0cSBkaXItc3BsaXQgKGNkciBkaXItc3BsaXQpKSkK ICAgIHZhbHVlKSkKCgooZGVmdW4gZGlyLXZhci0tcmVtb3ZlLWVtcHR5LXN1Ym5vZGVzIChu b2RlKQogICJSZXR1cm4gTk9ERSB3aXRob3V0IGl0cyBlbXB0eSBzdWJub2Rlcy4KQSBzdWJu b2RlIGlzIGVtcHR5IGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55IHZhcmlhYmxlIG9yIHN1 Ym5vZGUuIgogIChkaXItdmFyLS1tYWtlLW5vZGUKICAgKGRpci12YXItLWdldC1ub2RlLW5h bWUgbm9kZSkKICAgKGNsLXJlbW92ZS1pZi1ub3QKICAgIChsYW1iZGEgKG5vZGUpKG9yIChk aXItdmFyLS1nZXQtbm9kZS1zdWJub2RlcyBub2RlKQogICAgICAgICAgICAgICAgICAgICAg KGRpci12YXItLWdldC1ub2RlLXZhcmlhYmxlcyBub2RlKSkpCiAgICAoZGlyLXZhci0tZ2V0 LW5vZGUtc3Vibm9kZXMgbm9kZSkpCiAgIChkaXItdmFyLS1nZXQtbm9kZS12YXJpYWJsZXMg bm9kZSkpKQoKCihkZWZ1biBkaXItdmFyLS1yZW1vdmUtdmFyaWFibGUgKHJvb3QgZGlyLXNw bGl0IHZhcmlhYmxlKQogICJSZXR1cm4gdGhlIHRyZWUgd2l0aG91dCB0aGUgdmFyaWFibGUg VkFSSUFCTEUgc3RvcmVkIGF0IERJUi1TUExJVC4KUk9PVCBpcyB0aGUgcm9vdCBub2RlIG9m IHRoZSB0cmVlLgpESVItU1BMSVQgaXMgYSBsaXN0IG9mIHN0cmluZy4gIEl0IGlzIHRoZSBm dWxsIHBhdGggb2YgdGhlIGRpcmVjdG9yeSBzcGxpdHRlZAphdCBlYWNoIGZpbGUgc2VwYXJh dG9yLiAgRm9yIGV4YW1wbGUsIG9uIFVOSVggc3lzdGVtcywgdGhlIGNvcnJlc3BvbmRpbmcK c3BsaXR0ZWQgcGF0aCBvZiBcIi9ob21lL3VzZXIvcHJvamVjdC9zb3VyY2VcIiBpcyB0aGUg bGlzdAogKFwiaG9tZVwiIFwidXNlclwiIFwicHJvamVjdFwiIFwic291cmNlXCIpLiIKICAo aWYgKGNhciBkaXItc3BsaXQpCiAgICAgIChsZXQgKChzdWJub2RlIChvcgogICAgICAgICAg ICAgICAgICAgICAgKGRpci12YXItLWZpbmQtc3Vibm9kZSByb290IChjYXIgZGlyLXNwbGl0 KSkKICAgICAgICAgICAgICAgICAgICAgIChkaXItdmFyLS1tYWtlLW5vZGUgKGNhciBkaXIt c3BsaXQpKSkpKQogICAgICAgIChkaXItdmFyLS1yZW1vdmUtZW1wdHktc3Vibm9kZXMKICAg ICAgICAgKGRpci12YXItLWluc2VydC1ub2RlLWluLXBhcmVudAogICAgICAgICAgcm9vdAog ICAgICAgICAgKGRpci12YXItLXJlbW92ZS12YXJpYWJsZSBzdWJub2RlIChjZHIgZGlyLXNw bGl0KSB2YXJpYWJsZSkpKSkKICAgIChkaXItdmFyLS1yZW1vdmUtbm9kZS12YXJpYWJsZSBy b290IHZhcmlhYmxlKSkpCgoKKGRlZnVuIGRpci12YXItLXNwbGl0LWRpcmVjdG9yeSAoJm9w dGlvbmFsIGRpcmVjdG9yeSkKICAiU3BsaXQgdGhlIGZ1bGwgcGF0aCBvZiBESVJFQ1RPUlkg aW4gYSBsaXN0LgpJZiBESVJFQ1RPUlkgaXMgbmlsLCB0aGUgdmFyaWFibGUgREVGQVVMVC1E SVJFQ1RPUlkgaXMgdXNlZCBpbnN0ZWFkLgpJZiBESVJFQ1RPUlkgaXMgbm90IGFuIGFic29s dXRlIHBhdGgsIGl0IGlzIHJlbGF0aXZlIHRvIERFRkFVTFQtRElSRUNUT1JZLiIKICAoY2wt cmVtb3ZlLWlmCiAgICMnc3RyaW5nLWVtcHR5LXAKICAgKGZpbGUtbmFtZS1zcGxpdCAoZXhw YW5kLWZpbGUtbmFtZSAob3IgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRlZmF1bHQtZGlyZWN0b3J5KSkpKSkKCihkZWZ1biBkaXItdmFy LWluc2VydCAodmFyaWFibGUgdmFsdWUgJm9wdGlvbmFsIGRpcmVjdG9yeSkKICAiU2V0IGEg dmFyaWFibGUgZm9yIERJUkVDVE9SWSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzLgpWQVJJQUJM RSBpcyB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlLCBhIHN5bWJvbC4KVkFMVUUgaXMgdGhlIHZh bHVlIG9mIHRoZSB2YXJpYWJsZSwgaXQgY2FuIGJlIGFueXRoaW5nLgpESVJFQ1RPUlkgaXMg YW4gb3B0aW9uYWwgcGFyYW1ldGVyLiAgSWYgaXQgaXMgbm90IHNldCwgdGhlIGN1cnJlbnQg ZGlyZWN0b3J5CiBpcyB1c2VkLiIKICAobGV0ICgoc3BsaXR0ZWQtcGF0aCAoZGlyLXZhci0t c3BsaXQtZGlyZWN0b3J5IGRpcmVjdG9yeSkpKQogICAgKHNldHEgZGlyLXZhci0tdHJlZQog ICAgICAgICAgKGRpci12YXItLWluc2VydC12YXJpYWJsZSBkaXItdmFyLS10cmVlIHNwbGl0 dGVkLXBhdGggdmFyaWFibGUgdmFsdWUpKSkpCgooZGVmdW4gZGlyLXZhci1nZXQgKHZhcmlh YmxlICZvcHRpb25hbCBkaXJlY3RvcnkpCiAgIkdldCB0aGUgdmFsdWUgb2YgVkFSSUFCTEUg YXQgRElSRUNUT1JZLgpESVJFQ1RPUlkgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiAgSWYg aXQgaXMgbm90IHNldCwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiBpcyB1c2VkLiIKICAobGV0 ICgoc3BsaXR0ZWQtcGF0aCAoZGlyLXZhci0tc3BsaXQtZGlyZWN0b3J5IGRpcmVjdG9yeSkp KQogICAgKGRpci12YXItLXZhcmlhYmxlLWdldC12YWx1ZSBkaXItdmFyLS10cmVlIHNwbGl0 dGVkLXBhdGggdmFyaWFibGUpKSkKCgooZGVmdW4gZGlyLXZhci12YXJpYWJsZS1leGlzdHMt cCAodmFyaWFibGUgJm9wdGlvbmFsIGRpcmVjdG9yeSkKICAiUmV0dXJuIG5vbi1uaWwgaWYg dGhlIHZhcmlhYmxlIFZBUklBQkxFIGlzIGRlZmluZWQgaW4gRElSRUNUT1JZIG9yIHBhcmVu dHMuCkRJUkVDVE9SWSBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuICBJZiBpdCBpcyBub3Qg c2V0LCB0aGUgY3VycmVudCBkaXJlY3RvcnkKaXMgdXNlZC4KCkZvciBleGVtcGxlLCB3aXRo IHRoZSBwYXRoIFwiL2hvbWUvdXNlci9wcm9qZWN0L3NvdXJjZVwiLCBpZiB0aGUKdmFyaWFi bGUgXCJ2YXIxXCIgaXMgc2V0IGluIHRoZSBkaXJlY3RvcnkgXCJwcm9qZWN0XCIsIHRoaXMg ZnVuY3Rpb24gcmV0dXJucwpub24tbmlsIGZvciB0aGUgZGlyZWN0b3J5IFwic291cmNlXCIu IgogIChsZXQgKChkaXItc3BsaXQgKGRpci12YXItLXNwbGl0LWRpcmVjdG9yeSBkaXJlY3Rv cnkpKQogICAgICAgIChub2RlIGRpci12YXItLXRyZWUpCiAgICAgICAgKGV4aXN0cyBuaWwp KQogICAgKHdoaWxlIChhbmQgKG5vdCBleGlzdHMpIGRpci1zcGxpdCBub2RlKQogICAgICAo c2V0cSBleGlzdHMgKGRpci12YXItLW5vZGUtdmFyaWFibGUtZXhpc3RzLXAgbm9kZSB2YXJp YWJsZSkpCiAgICAgIChzZXRxIG5vZGUgKGRpci12YXItLWZpbmQtc3Vibm9kZSBub2RlIChj YXIgZGlyLXNwbGl0KSkpCiAgICAgIChzZXRxIGRpci1zcGxpdCAoY2RyIGRpci1zcGxpdCkp KSkpCgoKKHByb3ZpZGUgJ2Rpci12YXIpCjs7OyBkaXItdmFyLmVsIGVuZHMgaGVyZQo= --------------PVNIFZb1DJRbCkTqrRVUEHyN Content-Type: text/x-emacs-lisp; charset=UTF-8; name="dir-var-test.el" Content-Disposition: attachment; filename="dir-var-test.el" Content-Transfer-Encoding: base64 Ozs7IGRpci12YXItdGVzdC5lbCAtLS0gRGlyZWN0b3J5IHZhcmlhYmxlcyAtKi0gbGV4aWNh bC1iaW5kaW5nOiB0OyAtKi0KCjs7OyBDb3B5cmlnaHQgKEMpIDIwMjMgIEJUdWluCjs7OyBI b21lcGFnZTogaHR0cHM6Ly9naXRsYWIuY29tL2J0dWluMi9idWlsZGVyCgo7OyBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQo7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgo7OyAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKOzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7IGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCjs7 IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90 LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7IENvbW1lbnRhcnk6 Cjs7OyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGVzdHMgZm9yIGRpci12YXItZWwuCgo7Ozsg Q29kZToKCihyZXF1aXJlICdlcnQpCgo7OyAicmVxdWlyZSIgZG9lcyBub3Qgd29yayBmb3Ig c29tZSByZWFzb24sICJkaXItdmFyLmVsIiBpcyBub3QgZm91bmQuCjs7IChyZXF1aXJlICdk aXItdmFyKQoKCihlcnQtZGVmdGVzdCBkaXItdmFyLXNldC12YXJpYWJsZS10ZXN0ICgpCiAg KHNob3VsZAogICAoZXF1YWwKICAgIChkaXItdmFyLS1zZXQtbm9kZS12YXJpYWJsZQogICAg IChkaXItdmFyLS1zZXQtbm9kZS12YXJpYWJsZQogICAgICAoZGlyLXZhci0tbWFrZS1ub2Rl ICJuYW1lIikKICAgICAgJ3ZhciAidGVzdCIpCiAgICAgJ3ZhciAidmFsdWUiKQogICAgJygi bmFtZSIgbmlsICh2YXIgInZhbHVlIikpKSkpCgoKKGVydC1kZWZ0ZXN0IGRpci12YXItaW5z ZXJ0LXZhcmlhYmxlLXRlc3QgKCkKICAoc2hvdWxkCiAgIChlcXVhbAogICAgKGRpci12YXIt LWluc2VydC12YXJpYWJsZQogICAgIChkaXItdmFyLS1pbnNlcnQtdmFyaWFibGUKICAgICAg KGRpci12YXItLW1ha2Utbm9kZSAidGVzdCIpCiAgICAgIChsaXN0ICIxIiAiMiIgIjMiICI0 IikKICAgICAgJ3ZhcjEgInZhbHVlMSIpCiAgICAgKGxpc3QgIjEiICIyIiAiNSIpCiAgICAg J3ZhcjIgInZhbHVlMiIpCiAgICcoInRlc3QiCiAgICAgKCgiMSIKICAgICAgICgoIjIiCgkg KCgiNSIgbmlsCgkgICAodmFyMiAidmFsdWUyIikpCgkgICgiMyIKCSAgICgoIjQiIG5pbAoJ ICAgICAodmFyMSAidmFsdWUxIikpKSkpKSkpKSkpKSkKCihlcnQtZGVmdGVzdCBkaXItdmFy LXJlbW92ZS12YXJpYWJsZS10ZXN0ICgpCiAgKHNob3VsZAogICAoZXF1YWwKICAgIChkaXIt dmFyLS1yZW1vdmUtdmFyaWFibGUKICAgICAoZGlyLXZhci0taW5zZXJ0LXZhcmlhYmxlCiAg ICAgIChkaXItdmFyLS1pbnNlcnQtdmFyaWFibGUKICAgICAgIChkaXItdmFyLS1tYWtlLW5v ZGUgInRlc3QiKQogICAgICAgKGxpc3QgIjEiICIyIiAiMyIgIjQiKQogICAgICAgJ3ZhcjEg InZhbHVlMSIpCiAgICAgIChsaXN0ICIxIiAiMiIgIjUiKQogICAgICAndmFyMiAidmFsdWUy IikKICAgICAobGlzdCAiMSIgIjIiICIzIiAiNCIpCiAgICAgJ3ZhcjEpCiAgICAnKCJ0ZXN0 IgogICAgICAoKCIxIgogICAgICAgICgoIjIiCgkgICgoIjUiIG5pbAoJICAgICh2YXIyICJ2 YWx1ZTIiKSkpKSkpKSkpKSkKCgooZXJ0LWRlZnRlc3QgZGlyLXZhci1nZXQtdmFyaWFibGUt dGVzdCAoKQogIChsZXQgKCh0cmVlIChkaXItdmFyLS1tYWtlLW5vZGUgInRlc3QiKSkpCiAg ICAoc2V0cSB0cmVlIChkaXItdmFyLS1pbnNlcnQtdmFyaWFibGUKICAgICAgICAgICAgICAg IHRyZWUKICAgICAgICAgICAgICAgIChsaXN0ICIxIiAiMiIgIjMiICI0IikKICAgICAgICAg ICAgICAgICd2YXIxICJ2YWx1ZTEiKSkKICAgIChzZXRxIHRyZWUgKGRpci12YXItLWluc2Vy dC12YXJpYWJsZQogICAgICAgICAgICAgICAgdHJlZQogICAgICAgICAgICAgICAgKGxpc3Qg IjEiICIyIiAiNSIpCiAgICAgICAgICAgICAgICAndmFyMiAidmFsdWUyIikpCiAgICAoc2V0 cSB0cmVlIChkaXItdmFyLS1pbnNlcnQtdmFyaWFibGUKICAgICAgICAgICAgICAgIHRyZWUK ICAgICAgICAgICAgICAgIChsaXN0ICIxIiAiMiIgIjMiKQogICAgICAgICAgICAgICAgJ3Zh cjMgInZhbHVlMyIpKQogICAgKHNob3VsZAogICAgIChlcXVhbAogICAgICAoZGlyLXZhci0t dmFyaWFibGUtZ2V0LXZhbHVlCiAgICAgICB0cmVlCiAgICAgICAobGlzdCAiMSIgIjIiICIz IiAiNCIpCiAgICAgICAndmFyMSkKICAgICAgInZhbHVlMSIpKQogICAgKHNob3VsZAogICAg IChlcXVhbAogICAgICAoZGlyLXZhci0tdmFyaWFibGUtZ2V0LXZhbHVlCiAgICAgICB0cmVl CiAgICAgICAobGlzdCAiMSIgIjIiICI1IikKICAgICAgICd2YXIyKQogICAgICAidmFsdWUy IikpCiAgICAoc2hvdWxkCiAgICAgKGVxdWFsCiAgICAgIChkaXItdmFyLS12YXJpYWJsZS1n ZXQtdmFsdWUKICAgICAgIHRyZWUKICAgICAgIChsaXN0ICIxIiAiMiIgIjMiICI0IikKICAg ICAgICd2YXIzKQogICAgICAidmFsdWUzIikpCiAgICAoc2hvdWxkCiAgICAgKGVxdWFsCiAg ICAgIChkaXItdmFyLS12YXJpYWJsZS1nZXQtdmFsdWUKICAgICAgIHRyZWUKICAgICAgIChs aXN0ICIxIiAiMiIgIjUiKQogICAgICAgJ3ZhcjMpCiAgICAgIG5pbCkpKSkKCgoocHJvdmlk ZSAnZGlyLXZhci10ZXN0KQo7OzsgZGlyLXZhci10ZXN0LmVsIGVuZHMgaGVyZQo= --------------PVNIFZb1DJRbCkTqrRVUEHyN Content-Type: text/org; charset=UTF-8; name="README.org" Content-Disposition: attachment; filename="README.org" Content-Transfer-Encoding: base64 KiBJbnRyb2R1Y3Rpb24KClNpbXBsZSBFbWFjcyBwYWNrYWdlIHRvIGVhc2UgdGhlIHVzZSBv ZiBidWlsZCBzeXN0ZW1zLiAgQnkgZGVmYXVsdCBpdCB3aWxsIHVzZSB0aGUgZGlyZWN0b3J5 IH5idWlsZH4gYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCkl0IHVzZXMgRW1hY3MnIGJ1 aWx0LWluIHByb2plY3QuZWwuCgoqVEhJUyBJUyBBIFdPUksgSU4gUFJPR1JFU1MhKgpUaGlz IHBhY2thZ2UgaXMgbm90IGFuZCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYXMgc3RhYmxl LiAgRXhwZWN0IHVuZXhwZWN0ZWQgY2hhbmdlcyBhdCBhbnkgdGltZS4KCioqIFByZXNlbnRh dGlvbgpQcm9qZWN0IGNvbXBpbGF0aW9uIHdpdGggRW1hY3MgaXMgb2Z0ZW4gdGVkaW91czog dGhlcmUgaXMgbm8gYnVpbHQtaW4gc3lzdGVtIHRvIGVhc2lseSBydW4gQ01ha2UsIE1lc29u IG9yIG90aGVycyB3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uLCBtZWFuaW5nIHlvdSBuZWVkIHRv IGtlZXAgYSB0ZXJtaW5hbCBvcGVuIHRvIHJ1biB0aGUgY29tbWFuZHMuCgoqQnVpbGRlciog YWltcyB0byBzb2x2ZSB0aGlzIHByb2JsZW0gYnkgYXV0b21hdGljYWxseSBkZXRlY3Rpbmcg YXZhaWxhYmxlIGJ1aWxkIHN5c3RlbXMgZm9yIHRoZSBwcm9qZWN0LCBhbmQgYnkgcHJvcG9z aW5nIGEgY29tbWFuZCB0aGF0IHdpbGwgcnVuIGluIGEgY29tcGlsYXRpb24gYnVmZmVyLgoK VGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBoYXZlIHByb2plY3QgbG9jYWwgY29uZmln dXJhdGlvbiwgYnV0IHRoaXMgaXMgYSBwbGFubmVkIGZlYXR1cmUuCgoqIFVzYWdlCgpCeSBk ZWZhdWx0IGl0IHdpbGwgdXNlIG9yIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IH5idWlsZH4gYXQg dGhlIHJvb3Qgb2YgYSBwcm9qZWN0IHRvIGdlbmVyYXRlIHRoZSBidWlsZCBzeXN0ZW0uICBZ b3UgY2FuIGNoYW5nZSB0aGUgbmFtZSBnbG9iYWxseSB3aXRoIHRoZSBjdXN0b21pemFibGUg dmFyaWFibGUgfmJ1aWxkZXItZGlyLW5hbWV+LgoKVG8gcnVuLCBqdXN0IGxhdW5jaCB0aGUg ZnVuY3Rpb24gfmJ1aWxkZXItY29uZmlndXJlfiBvciB+YnVpbGRlci1jb21waWxlfi4KClRo ZXJlIGFyZSBkZW1vcyBpbiB0aGUgfmJ1aWxkZXItZGVtb34gZGlyZWN0b3J5LgoKKiogQWRk IGEgYnVpbGQgc3lzdGVtCioqKiBEZXRlY3Rpb24KWW91IG11c3QgZmlyc3QgbWFrZSB0aGUg c3lzdGVtIGRldGVjdGFibGUuICBUbyBkbyB0aGlzLCB5b3UgYWRkIGFuIGVsZW1lbnQgdG8g dGhlIGFsaXN0IH5idWlsZGVyLS1idWlsZC1zeXN0ZW0tZmlsZXN+LiAgVGhlIGNhciBvZiBh biBlbGVtZW50IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBzeXN0ZW0gKGEgc3RyaW5nLCBz dWNoIGFzICJtYWtlIiwgImNhcmdvIiwgImNtYWtlIi4uLiksIGFuZCB0aGUgY2RyIGlzIHRo ZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXJpc3RpYyBmaWxlIG9mIHRoZSBidWlsZCBzeXN0ZW0s IGxvY2F0ZWQgYXQgdGhlIHByb2plY3QncyByb290LiAgRm9yICJtYWtlIiBpdCBpcyBhIGZp bGUgbmFtZWQgIk1ha2VmaWxlIiwgZm9yICJjbWFrZSIgaXQgaXMgIkNNYWtlTGlzdHMudHh0 IiBhbmQgc28gb24uCllvdSBjYW4gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxpc3QgbGlrZSB0 aGlzOgojK0JFR0lOX1NSQyBlbGlzcAooYWRkLXRvLWxpc3QgYnVpbGRlci1idWlsZC1zeXN0 ZW0tZmlsZXMgJygibWFrZSIgIk1ha2VmaWxlIikpCiMrRU5EX1NSQwoKKioqIEFkZCB0aGUg aW5mb3JtYXRpb24KT25jZSB0aGUgYnVpbGQgc3lzdGVtIGlzIGRldGVjdGFibGUsIHlvdSBu ZWVkIHRvIGFkZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RydWN0aW9ucy4gSXQg d29ya3MgbGlrZSB0aGF0OgoKIytCRUdJTl9TUkMgZWxpc3AKKGJ1aWxkZXItYWRkLWJ1aWxk LXN5c3RlbQogOmJ1aWxkLXN5c3RlbS1pZCAibWVzb24iCiA6Y29uZmlndXJlICcoOmluc3Ry dWN0aW9ucwogICAgICAgICAgICAgICgoOm5hbWUgInJlbGVhc2UiCiAgICAgICAgICAgICAg ICA6Y29tbWFuZCAibWVzb24gc2V0dXAgJWIgLS1idWlsZHR5cGU9cmVsZWFzZSIpCiAgICAg ICAgICAgICAgICg6bmFtZSAiZGVidWciCiAgICAgICAgICAgICAgICA6Y29tbWFuZCAibWVz b24gc2V0dXAgJWIgLS1idWlsZHR5cGU9ZGVidWciKSkKICAgICAgICAgICAgICA6ZnVuY3Rp b24tbW9kaWZpY2F0aW9uIGJ1aWxkZXItLW1lc29uLWNvbmZpZ3VyZS1tb2RpZnktY29tbWFu ZCkKIDpjb21waWxlICcoOmluc3RydWN0aW9ucwogICAgICAgICAgICAoKDpuYW1lICJkZWZh dWx0IgogICAgICAgICAgICAgIDpjb21tYW5kICJtZXNvbiBjb21waWxlIC1DICViIikpKSkK IytFTkRfU1JDCgpUaGVyZSBhcmUgbWFueSB0aGluZ3MgdG8gbm90ZToKLSB+OmJ1aWxkLXN5 c3RlbS1pZCAibWVzb24ifjogdGhlIGJ1aWxkIHN5c3RlbSBpZGVudGlmaWVyLiAgQmUgY2Fy ZWZ1bCB0byBub3QgbWlzdHlwZSBpdCBhbmQgdG8gY2hlY2sgdGhlIGNhc2UhCi0gfjpjb25m aWd1cmV+IGFuZCB+OmNvbXBpbGV+OiBjdXJyZW50bHkgdGhlcmUgYSB0d28gdHlwZSBvZiBp bnN0cnVjdGlvbnMuIC9jb25maWd1cmUvIGFuZCAvY29tcGlsZS8uICBUaGV5IGJvdGggdGFr ZSB0aGUgc2FtZSBraW5kIG9mIGFyZ3VtZW50cywgYSB+cGxpc3R+IHdpdGggdGhvc2Uga2V5 czoKICArIH46aW5zdHJ1Y3Rpb25zfjogYSBsaXN0IG9mIC9pbnN0cnVjdGlvbnMvLCBhIH5w bGlzdH4gaW5jbHVkaW5nIGEgL2NvbW1hbmQvLCBhIG5hbWUgYW5kIG90aGVyIG9wdGlvbmFs IHBhcmFtZXRlcnMKICAgIC0gfjpuYW1lfjogbWFuZGF0b3J5LCB0aGUgbmFtZSBvZiB0aGUg aW5zdHJ1Y3Rpb24gKGEgc3RyaW5nKQogICAgLSB+OmNvbW1hbmR+OiBtYW5kYXRvcnksIHRo ZSBjb21tYW5kIHRvIHJ1biAoYSBzdHJpbmcpLiBCZWZvcmUgZXhlY3V0aW9uLCBpdCBpcyBm b3JtYXR0ZWQgYnkgfmJ1aWxkZXItZm9ybWF0LWNvbW1hbmR+LiAgRm9yIGV4YW1wbGUsIGlm IHRoZSBidWlsZCBkaXJlY3RvcnkgbmFtZSBpcyAiYnVpbGQiIG9uIGEgY29tcHV0ZXIgd2l0 aCA0IHByb2Nlc3NvciBjb3JlcywgImNtYWtlIC0tYnVpbGQgJWIgLS1wYXJhbGxlbCAlbiIg aXMgdHJhbnNmb3JtZWQgdG8gImNtYWtlIC0tYnVpbGQgXCJidWlsZFwiIC0tcGFyYWxsZWwg NCIuICBTZWUgdGhlIGRvY3RyaW5nIG9mIH5idWlsZGVyLWZvcm1hdC1jb21tYW5kfiBmb3Ig bW9yZSBpbmZvcm1hdGlvbi4KICAgIC0gfmZ1bmN0aW9uLS1tb2RpZmljYXRpb25+OiBhIGZ1 bmN0aW9uIHRoYXQgdGFrZSBpbiBhcmd1bWVudCBhIGNvbW1hbmQgKGEgc3RyaW5nKSBhbmQg YSBkaXJlY3RvcnkuICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIGNvbW1hbmQgdG8gZXhl Y3V0ZS4gIFZlcnkgdXNlZnVsIGlmIHRoZSBjb21tYW5kIG5lZWRzIGluZm9ybWF0aW9uIG9u bHkgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuIEZvciBleGFtcGxlLCB0byByZWNvbmZpZ3VyZSAv bWVzb24vIHRoZSBmbGFnIH4tLXJlY29uZmlndXJlfiBuZWVkcyB0byBiZSBhZGRlZCBhdCB0 aGUgZW5kIG9mIHRoZSBjb21tYW5kLiB+OmZ1bmN0aW9uLW1vZGlmaWNhdGlvbiBidWlsZGVy LS1tZXNvbi1jb25maWd1cmUtbW9kaWZ5LWNvbW1hbmR+IGF1dG9tYXRlcyB0aGlzLiAgfmZ1 bmN0aW9uLS1tb2RpZmljYXRpb25+IGlzIGVpdGhlciBpbnN0cnVjdGlvbiBzcGVjaWZpYyBv ciBnbG9iYWwgdG8gdGhlIHdob2xlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIChzZWUgYmVsb3cp LgogICsgfmZ1bmN0aW9uLS1tb2RpZmljYXRpb25+OiBhdCB0aGlzIGxldmVsLCBpdCBhZmZl Y3RzIGFsbCBpbnN0cnVjdGlvbnMgb2YgdGhlIGluc3RydWN0aW9uIGxpc3QuICBTYW1lIGJl aGF2aW91ciBhcyBkZXNjcmliZWQgYWJvdmUuCi0gfjppbnNpZGUtZGlyZWN0b3J5IHR+IChu b3QgZGVtb25zdHJhdGVkIGhlcmUpOiB3aGV0aGVyIHRoZSBjb21tYW5kIG5lZWRzIHRvIHJ1 biBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgYnVpbGQgZGlyZWN0b3J5IChhIGJvb2xlYW4pLiAg TGlrZSB+ZnVuY3Rpb24tLW1vZGlmaWNhdGlvbn4sIGl0IGNhbiBiZSBpbnN0cnVjdGlvbiBz cGVjaWZpYyBvciBub3QuICBGYWxzZSBieSBkZWZhdWx0LgogICAgICAKCioqIEZlYXR1cmVz CioqKiBNYWluIGZlYXR1cmVzCioqKiogQnVpbGQgc3lzdGVtIGRldGVjdGlvbgpBdXRvbWF0 aWNhbGx5IGRldGVjdHMgeW91ciBidWlsZCBzeXN0ZW0gYW5kIG9ubHkgc2hvdyByZWxldmFu dCBjb21tYW5kcyEKCioqKiogTW9kaWZpY2F0aW9uIG9mIHRoZSBjb21tYW5kIG9uIHRoZSBm bHkKU29tZSBidWlsZCBzeXN0ZW1zIGhhdmUgc3BlY2lmaWMgbmVlZHMuICBGb3IgaW5zdGFu Y2UsIENNYWtlJ3MgcHJlc2V0cyBhcmUgc3RvcmVkIGludG8gYSBKU29uIGZpbGUuICBCdWls ZGVyIGF1dG9tYXRpY2FsbHkgcmVhZHMgdGhpcyBmaWxlLCBhbmQgcHJvcG9zZSB5b3UgYXZh aWxhYmxlIHRhcmdldHMuCk1lc29uIG5lZWRzIHRoZSBmbGFnIH4tLXJlY29uZmlndXJlfiBp ZiBpdCB3YXMgYWxyZWFkeSBjb25maWd1cmVkLiAvQnVpbGRlci8gYXV0b21hdGljYWxseSBh cHBlbmRzIGl0IHRvIHRoZSBjb21tYW5kIHdoZW4gbmVlZGVkLgoKKiogQWxsIGZlYXR1cmVz CioqKiBCdWlsZCBkaXJlY3RvcnkKLSBbWF0gQWxsb3cgdG8gY2hhbmdlIHRoZSBkZWZhdWx0 IG5hbWUKLSBbIF0gTXVsdGlwbGUgb3V0LW9mLXRyZWUgYnVpbGRzIChyZW1vdmVkIGJlY2F1 c2UgaXQgd2FzIHV0dGVybHkgYnJva2VuKQotIFtYXSBQb3NzaWJpbGl0eSB0byBoYXZlIG9u ZSBidWlsZCBkaXJlY3RvcnkgcGVyIGJyYW5jaAotIFtYXSBDaG9zZSB3aGV0aGVyIHRvIHJ1 biB0aGUgY29tbWFuZCBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgZGlyZWN0b3J5CioqKiBEZXRl Y3Rpb24KLSBbWF0gRGV0ZWN0IHRoZSBidWlsZCBzeXN0ZW0KLSBbWF0gQ2hhbmdlIHRoZSBs b2NhdGlvbiBvZiB0aGUgc2VhcmNoCi0gW1hdIEluIGNhc2Ugb2YgbXVsdGlwbGUgYnVpbGQg c3lzdGVtcywgYWxsb3cgdG8gc2VsZWN0IG9uZQotIFsgXSBPdmVycmlkZSB0aGUgZGV0ZWN0 aW9uIGxvY2FsbHkKKioqIENvbmZpZ3VyZS9jb21waWxhdGlvbgotIFtYXSBDaG9zZSBiZXR3 ZWVuIGRlYnVnL3JlbGVhc2UgKG9yIG90aGVycykKLSBbIF0gKkVhc2lseSogY3VzdG9taXpl IHRoZSBjb21tYW5kIGxvY2FsbHkgb3IgZ2xvYmFsbHkKLSBbWF0gRWRpdCB0aGUgY29tbWFu ZCBvbiB0aGUgZmx5Ci0gWyBdIFBlciBwcm9qZWN0IGhpc3RvcnkKLSBbWF0gQ29tbWFuZCBm b3JtYXR0aW5nIHdpdGggZm9ybWF0IHN0cmluZ3MKKioqIFByb2dyYW0gZXhlY3V0aW9uCi0g WyBdIFJ1biB0aGUgcmVzdWx0IG9mIHRoZSBjb21waWxhdGlvbiBmcm9tIEVtYWNzCgoKKiBE ZXNpZ24KKiogRGVmaW5pdGlvbnMKL0J1aWxkZXIvIG1ha2VzIHRoZSBhcnRpZmljaWFsIGRp c3RpbmN0aW9uIGJldHdlZW4gYSBjb21tYW5kIGFuZCBhbiBpbnN0cnVjdGlvbjoKLSBDb21t YW5kIDogdGhlIHBsYWluIHRleHQgc2VudCB0byB0aGUgc2hlbGwuICBGb3IgZXhhbXBsZSwg Im1ha2UgLWoyIiBpcyBhIGNvbW1hbmQuCi0gSW5zdHJ1Y3Rpb24gOiBhIHN0cnVjdHVyZSBj b250YWluaW5nIGEgY29tbWFuZCBhbmQgb3RoZXIgaW5mb3JtYXRpb24uICBGb3IgZXhhbXBs ZSwgdGhlIGZvbGxvd2luZyBpcyBhbiBpbnN0cnVjdGlvbjoKIytCRUdJTl9TUkMgZWxpc3AK KDpuYW1lICJkZWZhdWx0IiA6Y29tbWFuZCAiY21ha2UiIDpmdW5jdGlvbi1tb2RpZmljYXRp b24gIydteS1mdW5jdGlvbikKIytFTkRfU1JDCgoKCioqIEJ1aWxkIHN5c3RlbSBkZXRlY3Rp b24KSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGJ1aWxkIHN5c3RlbXMgYXJlIGRl dGVjdGVkIGJ5IGNoZWNraW5nIGlmIHNwZWNpZmljIGZpbGVzIGV4aXN0LiAgRm9yIGV4YW1w bGUsIENNYWtlIGlzIGRldGVjdGVkIGlmIGEgZmlsZSB+Q01ha2VMaXN0cy50eHR+IGV4aXN0 cyBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuClRoZW4sIHRoZSB1c2VyIGlzIGFza2VkIHRv IHNlbGVjdCB0aGUgYnVpbGQgc3lzdGVtIGZyb20gdGhlIGxpc3QuICBJdCB0aGVuIHJldHVy bnMgYSBzdHJpbmcsIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBidWlsZCBzeXN0ZW0uCllvdSBt YXkgbm90aWNlIHRoYXQgdGhlIGRldGVjdGlvbiBpcyBjb21wbGV0ZWx5IGluZGVwZW5kZW50 IGZyb20gdGhlIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSwg dG8gYWxsb3cgYmV0dGVyIGZsZXhpYmlsaXR5LiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGlt cGxlbWVudCBydWxlcyB0byBvbmx5IHNob3cgYSBidWlsZCBzeXN0ZW0gaWYgc29tZSBjb25k aXRpb25zIGFyZSB0cnVlOyBvciB0byBub3QgZGlzcGxheSBhIGJ1aWxkIHN5c3RlbSBpZiBh biBhbHRlcm5hdGl2ZSBpcyBhbHNvIHByZXNlbnQuCgoqKiBCdWlsZCBzeXN0ZW0gdGFibGUK SW5mb3JtYXRpb24gYWJvdXQgYnVpbGQgc3lzdGVtcyBhcmUgc3RvcmVkIGluIHRoZSB2YXJp YWJsZSB+YnVpbGRlci0taW5mb3N+LiAgVGhpcyBpcyBhIGhhc2ggdGFibGUgd2l0aCBidWls ZCBzeXN0ZW0gaWRzIGFzIGtleXMgKGUuZy4gImNtYWtlIiwgIm1lc29uIi4uLikuICBTZWUg dGhlIHJlbGF0ZWQgZG9jdHJpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgoKKiogSW5zdHJ1 Y3Rpb24gc3BlY2lmaWMgdnMgZ2xvYmFsClNvbWUgc2V0dGluZ3MgY2FuIGJlIHNldCBmb3Ig YSBzcGVjaWZpYyBpbnN0cnVjdGlvbiwgb3IgZm9yIGFsbCBpbnN0cnVjdGlvbnMgb2YgdGhl IGluc3RydWN0aW9uIGxpc3QgKGdsb2JhbGx5KS4gIFRoaXMgaXMgdGhlIGNhc2UgZm9yIH5m dW5jdGlvbi0tbW9kaWZpY2F0aW9ufiBmb3IgZXhhbXBsZS4gIElmIGl0IGlzIHNldCBnbG9i YWxseSBpdCBjYW4gc3RpbGwgYmUgb3ZlcnJpZGRlbiBvbiBhIHBlciBpbnN0cnVjdGlvbiBi YXNpcy4gIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleGNsdWRl IHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIHdpdGhvdXQgdG9vIG11Y2gg aGFzc2xlLiAgRm9yIGV4YW1wbGUgeW91IGNhbiBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gfm5p bH4gZm9yIGEgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24sIHdoaWxlIGFsbCBvZiB0aGUgb3RoZXIg d2hpbGUgdXNlIHlvdXIgZnVuY3Rpb24uCgoqKiBQcm9qZWN0IHZhcmlhYmxlcwpDdXJyZW50 bHkgdGhlcmUgaXMgbm8gc3lzdGVtIHRvIGN1c3RvbWl6ZSBjb21tYW5kcyBvbiBhIHBlciBw cm9qZWN0IGJhc2lzLiAgVGhlIGV4aXN0aW5nIEVtYWNzIGRpcmVjdG9yeSB2YXJpYWJsZXMg Y291bGQgYmUgdXNlZCwgYnV0IHRoZXJlIGFyZSBzb21lIGlzc3VlcyB3aXRoIHRoYXQuICBU aGUgdmFyaWFibGVzIGFyZSBhY3R1YWxseSAqYnVmZmVyKiBsb2NhbCwgc28gY2hhbmdpbmcg dGhlIGNvbW1hbmQgd291bGQgcmVxdWlyZSB0byByZWxvYWQgKmV2ZXJ5KiBvcGVuIGJ1ZmZl ciwgd2hpY2ggd291bGQgY2F1c2UgaXNzdWVzIGlmIHNvbWUgdmFyaWFibGVzIHdlcmUgbW9k aWZpZWQuCkFsc28sIHRoZSBzZWN1cml0eSBzeXN0ZW0gaXMgZ3JlYXQsIGJ1dCBzaW5jZSBj b21tYW5kcyBjYW5ub3QgYmUgc2FmZSwgYSB3YXJuaW5nIHdvdWxkIGFwcGVhciBldmVyeSB0 aW1lIHlvdSBvcGVuIGEgYnVmZmVyIHVubGVzcyB5b3Ugc2V0IHRoZSB2YWx1ZXMgYXMgc2Fm ZSAoaG93IG11Y2ggb2YgYSBwcm9ibGVtIGlzIHRoYXQ/KS4KCiogT3BlbiBxdWVzdGlvbnMK LSBTaG91bGQgfjpmdW5jdGlvbi1tb2RpZmljYXRpb25+IGJlIGV4ZWN1dGVkIGJlZm9yZSB+ YnVpbGRlci1mb3JtYXQtY29tbWFuZH4/ICBBZnRlcj8gIFNob3VsZCB+YnVpbGRlci1mb3Jt YXQtY29tbWFuZH4gbm90IGJlaW5nIGNhbGxlZCBhdCBhbGwgaWYgfmZ1bmN0aW9uLW1vZGlm aWNhdGlvbn4gaXMgc2V0PwotIEZvcmNlIGJ1aWxkIHN5c3RlbXMgdG8gdXNlIH5idWlsZGVy LWRpci1uYW1lfj8gIExldCB0aGVtIHVzZSB0aGVpciBvd24gZGVmYXVsdHM/ICBGb3IgZXhh bXBsZSBPQ2FtbCB1c2VzIH5fYnVpbGR+IGJ5IGRlZmF1bHQuCi0gSXMgdGhlIGRlc2lnbiBz b3VuZCBlbm91Z2g/ICBDb3VsZCBpdCB0aGVvcmV0aWNhbGx5IHN1cHBvcnQgZXZlcnkgcGFz dCwgcHJlc2VudCwgYW5kIGZ1dHVyZSBidWlsZCBzeXN0ZW1zPwotIElzIH46ZnVuY3Rpb24t bW9kaWZpY2F0aW9ufiB3ZWxsIGRlc2lnbmVkPwotIEFyZSBkaXJlY3RvcnkgdmFyaWFibGUg dXNlZnVsPyBXb3VsZCBwcm9qZWN0IHZhcmlhYmxlIGJlIHN1ZmZpY2llbnQ/Ci0gTW9yZSBz cGVjaWZpZXJzIGluIH5idWlsZGVyLWZvcm1hdC1jb21tYW5kfj8KLSBIb3cgdG8gaW1wbGVt ZW50IGxvY2FsIHZhcmlhYmxlcz8gIExldmVyYWdlIHRoZSBleGlzdGluZyBpbmZyYXN0cnVj dHVyZT8KLSBTaG91bGQgfmJ1aWxkZXItY29tcGlsZX4gYW5kIH5idWlsZGVyLWNvbmZpZ3Vy ZX4gYmUgbWVyZ2VkPyAgRG8gdGhleSBoYXZlIHZpcnR1YWxseSBhbnkgZGlmZmVyZW5jZT8K LSBJcyBhIHByaW9yaXR5IHN5c3RlbSB1c2VmdWwgKHRvIHJhbmsgYXZhaWxhYmxlIGNvbW1h bmRzKT8KLSBJcyB0aGUgZGV0ZWN0aW9uIHN5c3RlbSBhYmxlIHRvIGhhbmRsZSBodW5kcmVk cyBvZiBidWlsZCBzeXN0ZW1zPyAgSWYgaXQgaXMgbm90LCB3aGF0IHNob3VsZCBiZSBkb25l PwotIH5idWlsZGVyLWdldC1idWlsZC1kaXItbmFtZS13aXRoLWJ1aWxkLWNvbmZpZ3VyYXRp b25+IGlzIGtpbmQgb2YgYnJva2VuIChhbmQgbm93IHJlbW92ZWQpLCBiZWNhdXNlIHRoZSBu YW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGlzIG9ubHkga25vd24gYXQgYnVpbGQgdGltZS4u LiAgV2hpY2ggbWVhbnMgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGlm IGl0IGlzIG5vdCBjYWxsZWQgZnJvbSB+YnVpbGRlci1jb21waWxlfiBvciB+YnVpbGRlci1j b25maWd1cmV+Li4uICBJdCBtZWFucyB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGluc3RydWN0 aW9uIGFuZCB0aGUgY29tcGlsYXRpb24gaW5zdHJ1Y3Rpb24gbmVlZCB0byBoYXZlIGV4YWN0 bHkgdGhlIHNhbWUgbmFtZS4uLiBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gaW1wbGVtZW50 IHRoaXMgZnVuY3Rpb25hbGl0eT8KCiogVHJvdWJsZXNob290aW5nCioqIE15IGJ1aWxkIHN5 c3RlbSBpcyBub3QgZGV0ZWN0ZWQhCk1ha2Ugc3VyZSB5b3UgYWRkZWQgYSBmaWxlIHRvIH5i dWlsZGVyLWJ1aWxkLXN5c3RlbS1maWxlc34gKGFuZCB0aGF0IHRoZXJlIGlzIG5vdCB0eXBv IGluIHRoZSBmaWxlIG5hbWUpIQoqKiBObyBjb21tYW5kcyBhcmUgcHJvcG9zZWQhClNPIHlv dXIgYnVpbGQgc3lzdGVtIGlzIGRldGVjdGVkLCBidXQgdGhlcmUgaXMgYW4gZXJyb3Igd2hl biB5b3Ugc2VsZWN0ZWQgaXQuIERpZCB5b3UgdXNlIHRoZSBmdW5jdGlvbiB+YnVpbGRlci1h ZGQtYnVpbGQtc3lzdGVtfj8gIEFyZSB5b3Ugc3VyZSB5b3UgdXNlZCB0aGUgc2FtZSBpZGVu dGlmaWVyIGFzIGZvciB+YnVpbGRlci1idWlsZC1zeXN0ZW0tZmlsZXN+PyAgVGhleSBib3Ro IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSBjYXNlLgoqKiBTb21lIGNvbmZpZ3VyYXRpb24gZG9l c24ndCB3b3JrIQpTbyBzb21lIGNvbmZpZ3VyYXRpb25zIHN1Y2ggYXMgfjpmdW5jdGlvbi1t b2RpZmljYXRpb25+IG9yIH46aW5zaWRlLWRpcmVjdG9yeX4gaGF2ZSBubyBlZmZlY3Q/ICBC ZSBjYXJlZnVsIHdpdGggdGhlIHBhcmVudGhlc2lzOgojK0JFR0lOX1NSQyBlbGlzcAogIChi dWlsZGVyLWFkZC1idWlsZC1zeXN0ZW0KICAgOmJ1aWxkLXN5c3RlbS1pZCAiYXV0b3Rvb2xz IgogICA6Y29uZmlndXJlICcoOmluc3RydWN0aW9ucwogICAgICAgICAgICAgICAgKCg6bmFt ZSAiY29uZmlndXJlIgogICAgICAgICAgICAgICAgICA6Y29tbWFuZCAiLi4vY29uZmlndXJl IikKICAgICAgICAgICAgICAgICA6aW5zaWRlLWRpcmVjdG9yeSB0KSkpCiMrRU5EX1NSQwpU aGlzIGV4YW1wbGUgaXMgaW5jb3JyZWN0OiB+Omluc2lkZS1kaXJlY3Rvcnl+IHNob3VsZCBi ZSBpbiB0aGUgc2FtZSBjb250ZXh0IGFzIH46bmFtZX4gKG5vdGljZSB0aGUgcGFyZW50aGVz aXMgYWZ0ZXIgfjpjb21tYW5kICIuLi9jb25maWd1cmUifikuClRoaXMgaXMgdGhlIGNvcnJl Y3QgdmVyc2lvbjoKIytCRUdJTl9TUkMgZWxpc3AKICAoYnVpbGRlci1hZGQtYnVpbGQtc3lz dGVtCiAgIDpidWlsZC1zeXN0ZW0taWQgImF1dG90b29scyIKICAgOmNvbmZpZ3VyZSAnKDpp bnN0cnVjdGlvbnMKICAgICAgICAgICAgICAgICgoOm5hbWUgImNvbmZpZ3VyZSIKICAgICAg ICAgICAgICAgICAgOmNvbW1hbmQgIi4uL2NvbmZpZ3VyZSIKICAgICAgICAgICAgICAgICAg Omluc2lkZS1kaXJlY3RvcnkgdCkpKSkKIytFTkRfU1JDCgoqIENvbnRyaWJ1dGluZwpJIHBs YW4gdG8gcHJvcG9zZSB0aGlzIHBhY2thZ2UgdG8gRW1hY3MgdXBzdHJlYW0sIHNvIGlmIHlv dSB3YW50IHRvIGNvbnRyaWJ1dGUgeW91IGhhdmUgdG8gc2lnbiB0aGUgW1todHRwczovL3d3 dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvZW1hY3MvQ29weXJp Z2h0LUFzc2lnbm1lbnQuaHRtbF1bY29weXJpZ2h0IGFzc2lnbm1lbnRdXS4K --------------PVNIFZb1DJRbCkTqrRVUEHyN--