From 4381e52f487d1bddc6fec23fd61a2bb06eeefed5 Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Fri, 2 Oct 2026 20:06:19 +0200 Subject: [PATCH 1/2] Add author profile for Rafael Winterhalter --- content/authors/rafael-winterhalter/_index.md | 11 +++++++++++ .../rafael-winterhalter/rafael-winterhalter.jpg | Bin 0 -> 8296 bytes 2 files changed, 11 insertions(+) create mode 100644 content/authors/rafael-winterhalter/_index.md create mode 100644 content/authors/rafael-winterhalter/rafael-winterhalter.jpg diff --git a/content/authors/rafael-winterhalter/_index.md b/content/authors/rafael-winterhalter/_index.md new file mode 100644 index 000000000..5fc948300 --- /dev/null +++ b/content/authors/rafael-winterhalter/_index.md @@ -0,0 +1,11 @@ +--- +title: "Rafael Winterhalter" +avatar: "rafael-winterhalter.jpg" +bio: "Rafael Winterhalter is a full-stack software consultant from Germany, living and working in Oslo, Norway, specialised on the Java platform. He is the author of Byte Buddy, a runtime code generator for the JVM that won a Duke's Choice award and a Groundbreaker award, and created documents4j, a document format converter for Java. A JavaOne Rockstar and conference speaker, he was elected a Java Champion for his contributions to the ecosystem." +description: "Full-stack software consultant in Oslo, Java Champion, and author of Byte Buddy, the runtime code generator for the JVM, and of documents4j." +bluesky: "https://bsky.app/profile/rafaelcodes.bsky.social" +mastodon: "https://mastodon.social/@rafaelcodes" +github: "https://github.com/raphw" +youtube: "https://www.youtube.com/playlist?list=PLJZg_b40WSWxixd7J57zPQRky9ReSRbCV" +website: "https://rafael.codes" +--- diff --git a/content/authors/rafael-winterhalter/rafael-winterhalter.jpg b/content/authors/rafael-winterhalter/rafael-winterhalter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d350c1e1ca25ece961318b9d69dd31ee6bd07538 GIT binary patch literal 8296 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 literal 0 HcmV?d00001 From 588bbbc54b6b1648841d6b10cecc21adc6fb8be7 Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Fri, 2 Oct 2026 20:06:19 +0200 Subject: [PATCH 2/2] Add draft: Introducing Jenesis: You Already Wrote the Build Script --- draft/introducing-jenesis/index.md | 100 +++++++++++++++++++++ draft/introducing-jenesis/jenesis-hero.jpg | Bin 0 -> 59626 bytes 2 files changed, 100 insertions(+) create mode 100644 draft/introducing-jenesis/index.md create mode 100644 draft/introducing-jenesis/jenesis-hero.jpg diff --git a/draft/introducing-jenesis/index.md b/draft/introducing-jenesis/index.md new file mode 100644 index 000000000..c3174c1de --- /dev/null +++ b/draft/introducing-jenesis/index.md @@ -0,0 +1,100 @@ +--- +title: "Introducing Jenesis: You Already Wrote the Build Script" +date: "2026-01-01" +description: "Jenesis is a Java build tool that reads the build from module-info.java: no build file to write, no plugins, no build tool to download." +authors: + - "rafael-winterhalter" +image: "jenesis-hero.jpg" +categories: + - "Developer Tools" + - "Tools" + - "Maven" + - "Gradle" +related_posts: + - "foojay-podcast-81" + - "my-final-take-on-gradle-vs-maven" + - "modules-modules-everywhere" + - "how-to-create-sboms-in-java-with-maven-and-gradle" +--- + +Over the last decade, Java has changed considerably. The language gained modules, records and virtual threads, and the platform moved to a release every six months. The way we build Java applications, however, has barely changed. A `pom.xml` or a `build.gradle.kts` still restates what the code already declares, such as the project's name, its dependencies and its main class. On top of that, every step beyond the defaults adds a block of configuration and typically another plugin, until the build has become a second program that needs to be maintained beside the first. And before a single line of code is compiled, a wrapper first downloads the build tool itself, which in the case of Gradle are 152 MB. This article introduces Jenesis, a build tool that I have written to approach this problem from a different angle. + +## A space that seems stuck + +Maven 4 is on the horizon, and after many years of work, its release will be welcome. It does however not address the weaknesses that I described above. The build remains a second description of the project that is kept in sync with the code by hand, and the full test suite is still run on every build. Even for the Java Module System, Maven 4 adds a file of its own for tests, named `module-info-patch.maven`, which uses a syntax that only Maven understands. This file exists next to the module descriptor that the Java platform already offers. + +Most alternative build tools of recent years replace XML with Java, Kotlin or another language, while they retain the model underneath. Such a "Maven, but in Java" is more convenient to write, yet it remains a separate program that describes the first one. + +I have been in a similar situation before. When I started Byte Buddy, Java already offered several libraries for generating code at runtime, and adding another one with a nicer API would hardly have been worth the effort. Instead, Byte Buddy looked at the problem differently by allowing to define classes with plain Java types and to delegate to ordinary methods, without requiring any knowledge of byte code. With Jenesis, I attempt something similar for builds, where the different angle is that a project does not need a build file at all. + +## Why feedback loops matter more than before + +I expect that languages and programming platforms will increasingly be measured by how quickly they turn a change into a result, and by how easily they adapt. Coding agents are a large part of this development. An agent edits, builds and checks its result in rounds, and it often does so in a virtual machine or another cloud environment that starts from a fresh checkout. A platform therefore needs to evolve with such workflows in mind, and this includes its build tools. + +In this regard, Java is in a good position. A modern JVM executes code as fast as natively compiled languages, the same byte code runs on any platform, and compiling a change takes only moments. The build, however, does not keep up. A fresh machine first needs to download a build tool and its plugins, and every round repeats work that was already done before. Jenesis attempts to make building a Java application trivial, such that JDK 25 or newer and a checkout are all that is required. + +## Reading the build from the code + +[Jenesis](https://jenesis.build/why/tool/) derives the build from the code. With the Java Module System, every module already declares its name and its requirements in a descriptor which `javac` compiles and validates. Jenesis treats this `module-info.java` as the build file, and any metadata that the descriptor cannot express is added to its Javadoc. As an example, consider the following module: + +```java +/** + * @jenesis.release 25 + * @jenesis.main demo.app.Main + */ +module demo.app { + requires org.slf4j; + requires com.fasterxml.jackson.databind; + requires info.picocli; + requires static org.jspecify; +} +``` + +This descriptor already describes a complete project. When starting a project, one typically wants to use the latest stable release of every dependency, and Jenesis can therefore determine these versions on its own. Running `java build/jenesis/Make.java pin` writes each version into the descriptor, together with the checksum of the resolved artifact. + +Jenesis itself is plain Java source code of 2.3 MB that is committed to the project's `build/jenesis/` folder and launched by the JDK, without any wrapper or distribution to download: + +```bash +curl -fsSL https://get.jenesis.build | bash +java build/jenesis/Make.java +``` + +Trying Jenesis does not require modularising a project. Since every artifact on Maven Central describes its dependencies in a POM, Jenesis needed a POM parser in any case, and it can therefore read a project's `pom.xml` just as well. Installing Jenesis into an existing project is the quickest way to try it. + +## Caching and isolation + +Every build step is keyed by a hash of its inputs, such that Jenesis skips any step whose inputs did not change, and only runs the tests that reach a changed class. This also makes sharing build results between machines trivial, as a single property points the cache to a shared folder or a cache server. A fresh CI runner or an agent's virtual machine can then reuse what was already built elsewhere. + +When an agent, or a human, clones an unfamiliar repository to build it, to run its tests or to reproduce a bug, the build also executes code that nobody has reviewed. For this reason, Jenesis can run every build, and every program it launches, in a throwaway container that cannot reach the home directory or the environment of the host. Once enabled in the user's own configuration, this applies to every build, and a project cannot opt out of it. As a result, AI agents and humans alike can consume unknown Java projects safely without taking any additional precautions. + +## How Jenesis came to be + +I started working on Jenesis in 2024 and developed its core by hand. For a long time, I did however not see a way for it to compete. The established build tools offer a rich ecosystem of plugins for almost any need, and matching it on my own, with the time I have available, was out of reach. + +I did, however, have a large number of sketches that planned out the architecture, and based on those, coding agents helped me to get Jenesis over the finish line. In particular, agents took on work that no single maintainer has the time for. They built countless real-world projects with Jenesis and summarised the bugs they encountered, and these reports showed me where the architecture did not hold up, so that I could readjust it. This way, Jenesis reached a level of maturity that an open-source project could not have reached in this amount of time before such tools could take over this kind of grunt work. Today, I consider Jenesis as mature as other open-source approaches. + +## Further features + +Beyond what this article describes, Jenesis offers the following features, each of which is shown by a small, runnable project among the [69 demos](https://github.com/jenesis/jenesis/tree/main/demo): + +- A test module names the module it tests, and Jenesis infers the JUnit engine ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-35-test-framework)). +- The modules of a project refer to each other by their module names, without a root file ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-04-java-modular-multi)). +- Sources under `META-INF/versions/25/` produce a multi-release jar without further configuration ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-11-java-multi-release)). +- Kotlin, Scala and Groovy are compiled within the same module as Java ([Kotlin](https://github.com/jenesis/jenesis/tree/main/demo/demo-41-kotlin), [Scala](https://github.com/jenesis/jenesis/tree/main/demo/demo-44-scala), [Groovy](https://github.com/jenesis/jenesis/tree/main/demo/demo-46-groovy)). +- XML, Protobuf and Avro schemas are compiled to Java as part of the build ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-16-data-formats)). +- Only tests that a change can reach are run, and build results can be shared across machines ([tests](https://github.com/jenesis/jenesis/tree/main/demo/demo-37-test-selection), [cache](https://github.com/jenesis/jenesis/tree/main/demo/demo-49-build-cache)). +- SHA-256 pins, OpenPGP signatures and Sigstore identities are verified without any plugin ([pinning](https://github.com/jenesis/jenesis/tree/main/demo/demo-28-pinning), [OpenPGP](https://github.com/jenesis/jenesis/tree/main/demo/demo-29-openpgp), [Sigstore](https://github.com/jenesis/jenesis/tree/main/demo/demo-30-sigstore)). +- The build and the built program can run in a container without access to the host's secrets ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-50-docker-isolation)). +- Jars are byte-identical between builds and contain a CycloneDX SBOM ([reproducible](https://github.com/jenesis/jenesis/tree/main/demo/demo-67-reproducible), [SBOM](https://github.com/jenesis/jenesis/tree/main/demo/demo-31-sbom)). +- Two versions of the same library can coexist in module layers instead of being shaded ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-24-module-layers)). +- A `jlink` runtime, a `jpackage` image or a container image each require a single line of configuration ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-09-java-modular-executable)). +- Checkstyle, PMD and SpotBugs are enabled by their configuration files, and Error Prone, JaCoCo and PIT are supported as well ([linters](https://github.com/jenesis/jenesis/tree/main/demo/demo-34-java-quality), [Error Prone](https://github.com/jenesis/jenesis/tree/main/demo/demo-14-error-prone), [coverage](https://github.com/jenesis/jenesis/tree/main/demo/demo-36-code-coverage), [PIT](https://github.com/jenesis/jenesis/tree/main/demo/demo-38-pitest)). +- Custom build steps are written as small Java modules, with types, IDE support and refactoring ([demo](https://github.com/jenesis/jenesis/tree/main/demo/demo-58-project-plugins)). + +## Modules didn't fail, build tools did + +When the Java Module System was released, many projects concluded that modules were not worth the trouble. In my opinion, most of this trouble was however caused by build tools that treat `module-info.java` as an afterthought. At JavaZone 2026, I gave a talk on this topic, and on what a build tool can look like if it starts out from the module descriptor instead: + +{{< vimeo id="1223683963" title="Modules didn't fail. Build tools did - Rafael Winterhalter at JavaZone 2026" >}} + +The [Jenesis website](https://jenesis.build/why/tool/) compares fourteen common builds side by side in Jenesis, Maven, Gradle and Bazel, and the [getting started guide](https://jenesis.build/tool/getting-started/) walks through a first build. The source code is available on [GitHub](https://github.com/jenesis/jenesis) under the Apache License 2.0. This article describes version 0.15.3, and I am happy about any feedback from using Jenesis on your own projects, either as a GitHub issue or by email to hello@jenesis.build. diff --git a/draft/introducing-jenesis/jenesis-hero.jpg b/draft/introducing-jenesis/jenesis-hero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6c767c18256cb5c03072b8462cb056ee774d83a GIT binary patch literal 59626 zcmeFY1yEf}(=NPmcXxLU?gV#t3+@4eJ0t;uy9Rf6mmLW1?i&m4Zow}(=R2=`dF#LT zR(*fft$NpHvu1jFW_q6K>F!yx*UQ4o4*;sHq>Lm03=9AOd;I`jmH=V^NQl=9{MUa- zNJuDXcxY%SC}>1jI2d?jL=G;9nMR4gM1??oC2fgie*8Pfe^UQJ;6Dib z2Z8@R1cbFmI*j3pMQu=11F3WVXA)n3MpOQLIQ!od2mnBdy)*{@`2WET=bx2j^gABe z@crVA4qw_a;I!`bisCr?dlRpA;LTMY_sF$_(Io|_aGU1I!kMg;tN)qdpL74N-&bE_TXjG7j`{d#6>r?vcD(#@;rD2QyWnCI9snC{ z&%Y6PhmGHgJUM zjDA>^Q-rOo(6IJHdi&3k0e&wUbT{|A7C&HSs_uUIoNf2~E&!?M*IW=zj3pdK@(RrH znf-G+e*ywI;ICHTyc|u7Fc1?*Jzl5v#C?JSvfZL0$^*v;B)Ro zu@3N9-Z!^({AOOrA(XytPp7AU=>8c~-&SYRMy-L$&c<6&ueZALm?=40CUaL@a8==i zC^LY41OP|k=lk)Wg?i1w$n31}?>yX!UA_S9F84N@%_W|Kw*!>ngc>f8 zDh(BQ0=Szlhx`R<0l&u`0NES@Iy8Ue(w*Q005V9pVP^nfe57^8%GELyfAofU0gKq2 z{iHzpk1GFrREhXgu1>#Raf|)%&E`caEjv(}_cIB*ZsJgE91f2X{rz@^rHW68kS2)N6~HwlEJ zulWjz9Uusz_Z`^fAN(oiSvY-@rxJx2bn8gU1>$R}bOq){uZmcA8ob{`zWt|`|4STb zwH={P%A-q~jI%MXO7ZWn-%Iju_=RzuU#&ER_d`{#ywN}E(tqRsJ;?u!?N7oVHWClf z_NFSjvJ`j_uYi%KMSYkCe4s37U%LNL)P(Py@HDy}CDb%j%3eMkau<3 zh53!+ISu@?+-awEWqy8I?Q$#vbbi^V3K*{@`EQ;5E%EQr^1ZvdA>HlZP`8^k*d(f| zepm2gK@gBU2w|G7eX&pYv!`I^`m%{=N##LULV@%oC{Tb%DmMdPW&CtW`&(1z;$~VYK zndq`*Xel0O%oG-Ly;tJ?e$2M%<9dgq8{n^ROKZ>neG>)kHsxhA{-kR09Od zYKG7=aLKC*=IcD&hHef71HW88LyiEul7F3--Qav`^HMTAA<3dYWBti7ZhO91ZmWHX^L95 ze-3Yr8+c~$uigasC693`>CL-xuwD7gOnFg^zDr~#cD>TdFmHCPgjqv2==KdR;SFlV zLLNvk>|p$*(|?5q26Wzj?;;vAUCsLqvQDb3`~6qjp*>x&1?{J+vV^j*b2oGMKODB) zHmMxBW|%@fe=<2;U-P?0H6J$HCDPNGo~W#;X>M#~${ZD!#!h3rQcA_BQ?~0zi+?F4x2g4H*{WJu9|1~>8D2iH z&*A4DB2K8T7GD+u-~2O?62mT zUFCAP`$P9JBjg5|i71%wBFkqpBU-1~bAIxjYf`9pqu%@3rDh_I8-_Sn;402=TQJJ< zFVpsyUc4qzmhUR8T3!4#)y1(i$jv& zw|#Vv%q>y3n+KfrsFJ*!^JQjy4m`ivx>hWU8%?g+T%U=zR^$F<-v1gP_I*%WbP=|f zzvAv*>51zS@Orv?aWD*6jvbZmn&LELZ;x8x%ILPNdT+_!9OO{!LZUSmL@u<;EoVFJ zaFI82ipI%lKoh-MrqH^0!fxw&h;7StML--kjGg38BCHFek|9<@$DE*>i z7*oaLf`9)97Nks2`N!YP%`HqG7rw$i*O(NpX0OoaA6wu*cz@(zb%LCKWbG;!2TOlBBZ)+DRiyIOH96 zC`q}s)w8S`@2ju%Co!M>mk{Ou1`DvJ8TNvt zdRt5DoSLc5%xZ3a*|^d6?0E*}Hq8vChIFuRliYo`xf6Ll6A`y#9&Ebwruo*T;M?fc zEV@MatwdV#;j==tEsuraLbn+O{}ST<9zH!ARg7DkCe1gcG-GvFTa{mBS6vYb+-!9Z z@b@~U_BAoW_yWVW4*NEEy$j^%b^Qv;c*8o|X&FY!csFy8a1!|?)3{UQ_EK(BGXn~a z&nx+k^u5OazWMme&S5{g6f^N&&Sloxo98f{O?3z}mN5+bVU;nX#x(<{j(T(&#_DKX zjkouA?Z*0jN^8021l)F(Bwnj4->T4QUU}r9x^tFU7 zS=J?1Jm`3W){;gc8G_87TI~o+s~X^pDqQ9M<`RBy4FG(>Lc?WzW~Ic8Hn(|YN1Pe` z8%;!B_Oj~l_2Qyt+HH#;9+;f&6rc63WU*n})r1W*6x(|4X;{Vz-Rub(>xxu4@ei5x z#$4~l%G1I|{dIt#yF$W)r(w6&GzjIt6!I?!^hz0BT~18W8tw0TmR;)y^ZQ0uba@Yb zj%P7^T3uyZ?RIWDgx zpTn|?C37N1K1R0{YHi+f#Mb&TgGdMOOo6BX_@tRVQ0a$u9siCx>Zr}iz6&uWy^{GG7& z%^jJBFju=Td3U|Y=DbLpS|JlH`VVS>jx$(@E z|Cy-lp}G3@t0rP<6cNMKQ{JJ^llIl!_rJvX)9&uM90m&xaQsF5{r&f7DSZrY$9Epx zTdp4iR`KjB8fb#zn;4GObo)*Xts-ptFIrcb@Ji_%G%|D>HJ^Rr-Rp`=Zw;rYmXB;I z+3TRE!H10QP#G2LS^K z4h9bMs~<>k2q*v;G&%+ryD};!HYq2U5gIGU+c#`vI3h6Q6qHol-(OG6U|&z!z@Wfi z06Sb0rT_1Irm9kOXWfNZY*%N^52`j^08Gx0G@HVU9Z7AYKZkwVt9g2`Z-a`e9N@<_ z&OMiO&eyOGP$7^FgDlIs>Sllzj`bA?c4G;r{F_V{_kDuI6Q~9)nBG#IY%8mzq>BLN z!*}v!AOpHp_e8kXWdXMy?hS>D`|t0*f*cAZ@8{#` zZ<1x*Gq!{61kdYfH&0QYHVGp1@?+5tD^}Mee0bXpwZmOmx^9N}lE@&OMh5)3j)ybk zJUV{W(RwQ6b|@@Mhfm^mKaEc3HF*?#We*%!3sH&!+HQ&`qcn!6M|OH()RVa*Yyx(_=Fha9Wut_>{u_nxKlT`VK7y@LDa}XT6$j7l_ zgGifXqc|vg!A;U>E^$L*sgiXaldT+A>8^VQ8W|wk)d~RG>R5S5HYwpTREcC(&H*xu zUqFt#Ss}4_NiaS|vViI~&6Mo@2|W{+WRrg87l4Ann|4Ek$m=R=I=yEYPuN^v{3+eXcmJqS7^VDq)<&W%WWfMl1TZ!?_pa=PBO1}&4~*6 zajF7+@;ch|w|H#OVo70jK5!1;GdMqdQg3S*c#U)m+ChZJ@$wpId&|3Av8GMG}2NazWQmq3k2(M^Tl6FADM0 z^ou;R>ALyP)havg7*)^qXhX;$F?J^4HlHYS!Cdo)YB#y#{4Pq8(P}4LmlEo$N3tmr zsL)73JxBW4QPt~63vF_2$?9blzOP`Z21~?aZMpK1TtuC8MgSKfZg!{|M_^uO@jU6y zSC(e-G4Rq_dSGE7;3~BrE<{1xM4XuW)AuTf{;4ygldo1zxp1%D0lVLS+M@Rwi z+^~Dq^&kWSp|H=vbOpJ6Kgx!Lt)B|1qA&I~AtOxXlG5QvVAV!|eJ50=V9m)i6Q$5W z7P``-c=x6+?_&v=Dp@_bqzbJK&&@|8&c4OaBFcEGC)eY)%nD7cOfy zGeN(*qK&-xn60BGqjDuq^k7ljM@)AgY>K&*Tfn`5xZpOE@mt1W z`Tmr3i3gW8kw3=sImJkb*{Lmea6d`cByTJ zkT{l7D>&(Q`SJ<^+>*Y-Z|Woz$aZwU+88ov?feK+DDH*LQ0v4py_BN>%kMW^sz{%} zr<2V-hMWEHcIJf!h5u598@pcez!yM6;7@O#_9ENWdGXNVChV9Z8M5cjFiLKqnxL&m zsaI8kVhKykosx1<3j8bS9erlO)^rq^tzM-|k>{$#&8-wBrxa!^e^0~FXgl#5%XZ}@ z@KI%}89v3$EV%N{5XB++V%~EN@6Vh0rz|RibaE+&AzJa&stz1ng7a}Z_o&i8>qUa* zU4P^$@2eaYpBy9SiAKrAoexFnbwzZ?okB~5AnplFXP-E2 zL5H;k#8M!A!e_(Npd`ilG;qtJ0-I_zV2bioR`Nt@K*mtd0N_9|tQOfNUbA$6<100NA+&6SI zSty-!toBoyF7)x#YnZdJNlM)-UUq!2WT2fytgkMybZs9hs1c<&-e?IZHeec9c7NTe(U@9){_Uv$l%(C6maq1 zc!OjMBSK@NFW~S!=N*u~8YBkEfqK6WL)mv`Z_D9yvnMDALMpIz_we-5a9jg1n64t^A z3|&>x-avs(m~uhdMnHA5vg_NoIpUcMNh-lkXpKbIkTZrsAq|@hYos-({25&?t}Wxd z`I6Y`6D*p1Kfai(owa+Q^xiXzD6~os5f&MNV~*K~*}|r2rU|ruOgL-|Ng=LB9DM%{ zI6j&RBpUe?Zqi49X+8@5o0}ZduT)x1o;=daVT62atY-xKc7M$YkdZ-{Ne8kCE{wEm z*ooMsdD=gXkRB;Y)jp`}!L63?%Otj<0k@@b0R|I}&ahj36g5`F0KJLiq$AV-zH`kq zjbz+#v5&j1*b!z|5FZwt15tT$nB%7*N-2rq+!LH|(!JisttggbzTv0I05ZX;I%K-q zL^}HZi!X}^y)mu{(m_;YzmOPi-PDesq9^B)9nrZ4zVT!*i}k5SaqRR{vu~X$dXhY8 zo};`93yF-Y!}i&fR3B?Z;z;9*r+*`B3lC@G4(T~h@B#=nlPxY5$k<&<8h&mkeF0eU zLT^&*AtC2NEKjX|iuX=0R7|{$i_GITbZRd)BXVrG7@RsqyTJ_XV|bR zNC`EoIy?0)t_xU0`#JfxD!Ou#X0?$lA1+-n3NMp0h#St^vWBIj6P{Yp;o?X`g>K7^%7Yl zNI_|w9h>RYl>s-)`rLZ`3l)=;R8(nF5-}ysst)AF^K^N~3hu~;Nto!wp^dC&xOnfP zwXABgf!!A;JbNaFKWxjFXmPR)xb9_Q4g@qji=FoZeEB`FmejctMseWUu)yylh_+%< zxv1xm>nAAqP@z#`YAkiAZ;*Ac-Esj)M%XEA>kH_Nuyj0UOYe*KsHHOyRYJ01AcNV+ z$XDYc>P4+`Oh)@Z!}CU1h^W9j29P@h>(rQAObPKF0U1q^x5*+QXt!9ivn2Z?u^>6j z*h=N4AHIhkA$Jnt#bw!0maDQ&($$FerbV+-YNM)-^d66bA4N&pqE&85HbezbpyBrf zwuy<3up<-NR#PEh+Vd`GPrTt8oEWN&jg7z~7wn3T9YhSXv0$6z`lA`9ft~8XY?1do z`C>9i=-uLDr0*RE_llDYv%Yu{-9nx`-J1rTvoQFy7bY6e<1nP)$7TrHymNUvvX^6a z@>XpiGcm8-)Zv{@0Pe5ld=+m=IwD|+LuDZtnk;B`yv7nT6BFW2EU~UFWYPR~{NbX+ zkuhQ)r0KFd0j$-}e>M7TV1wqLYT1h_%q`_|+376bU!J00gCz_|N&Q^a%r_&B7y6tS z6Q#!68QK(edgaX>V?adf6V|>7JZ(O$x9(S@V<11?f(4Vw!n#=;48jT0rkz5TA8|fy z{j-$XKyes3R9wJf-oKcia)JEEF&=WvN_wvaM+jncshNIamsPL-8sqh{yVsfIs#a%A z_sH2}-Z?q0{ugovC6TRhk3^|WxwfxycQN1`X+!%NAp|o+H-!AM!dOC#d%cwyk_=-0 zhkw-$MH^gJ)#VK78_)3LdnZf(eGGg~ax&&La84Cchv(k(TO3Rc8F_P0ERwr3H3e~s zezHr`<6DxR;;i@=0LC4p%#@UA+x%y)i*`gO!8<}WUuYD2d^rK6@7Cc6criSc|GQ$WQ2N?Fx8UC6+AhL5)#O;x6u`|;N~`B6ww5q|`p?Hf_EXwpdvOD?+^0=yiF zwEK!MLRj$(X=FmfuHu9vA5`$$?2WgALRY=1b(Bq!9!b z9$sQ9{P7AK$HmZgMgfYIHFPfPqFht+JktYNQJ$Hm7{njja+vDymGN~3_d;rS_nm6Bpb(Ja|<=}j4PfUSD` zAc~9eO+;3HQzXOVVqH_^x9QWK-#vyb+J!@IVKhcT?Rm6$)g56LTkSU=ehti<|E?So z16&ST8SF7m+#+71&3PLVF6J~vo0P1=ZUhUtQ5e#&+h_M-7hjM*Swx?@#yDaLV>Y`>c2 zndJfbvVHR(3~fk6oii6Pk*WzKd%OyHwG0>|}GgP#N+ znK(SuOrWIiO=B&pG2T061fHvc2QX%;LN?YuXxDYJjl4yC)`${{P20@qV6i(0v91wz zRDdmHeP=QXRF@2GUz&~f8}hWCi5@Wws{p0Qi00dvWFU_F)9apJ3Fqp2X7vRxr6(m0 zID1X(&+E1xN_mmFuS0_V_(Y$n!~Ch-v>421;bOe~NpGGRZ*o+36!T#5;D-ueGvyNw zp~`UHBo1xh&RD-Eb`G;7m6Jy|b|}sZ^4laJGlQq(!ytpM^H2p@xj@M<5HahG(0=T0fOI-1v(ae!P4-^Qe z8_sH%{~qHeQ!UX6Vk05=5(ms*76=J~IO6+o^GKw6&K3Gpc;_pxg8^>;B`FrEHb081 z8~d$;@Eb}6OdaT$r6{(;y0|KKPqh;;bf^U0*Dt?4&u~*#vMM)W8_?_BF((uGKo_wQ zH*h313{}(uCDyY!-MeOyJquEYUDUh@d%71}q$)xMoNw!>t^#yh8tC;JtSnb?=)~;=6;KGvKi1T(qT%W z+0(mWLeb}jE%4pJq2T;f%!Uj3RJL~kg4(1Ln;u$#T@pZ+K8T1H>lBf7CK7-IkVGO3 zzCh6riK-8k!yz&&@t6Z|t~RcQH!;q~i-@vQ^MQX;v|;+04DEZE_+>0>S3CnOzp=;y z^Ez+0yZ>vborHc|7nyn%9e+-J=PO5eou0aONA^?{=~ZGQ>n!tG533r{cipgKrrdj? z8@0@gmpr~sAcz?S-?|5k;N(upZR-UPL>tr*ZORA?u0_!g+JGg$$Og*KSmo-vB6y)w ziVXl|i5zHNpW+Q}5~rb@_=LF6(iI+=EcE{v(0w%Cn+~?T$=LPOKbcHP{)GtX@CWkY zfl6hjajVb>;b0tc-*FC~uQwnXN~*bHy0#$vImHWIj@@X=_la|ol8R4R_*!kli43de z1=Kw80Ht=^XKMd%(s*l8u)E*=d#=f7#lt>jkxITBT+^l4Qb)UxI!E86_V_S??4UR> z%1=T=!F6{mDcgcyLYGMzzuR_3QvXK?{*3>|40@kRNN)}JXa3a*zuMh}V$m z-d3p(J+1Wi&i|)|m4aPisPm?3&5*KaMP3-whH5 zdjU|vs+3~-3UNl=!3zb#t7jJ|d9IZD1;b;yH#VVtjHIz|1N|f#%slH4TYD zGe+uBG5r{aieVH^$PQN@>V{#GI&}z%yJ>`Knh_(C9~!9_i?)Ge?f9`3%N`Cyr5Q@` zgXltoa6n_Q^utGs{c(HlfYYCf<%nw@3gwH}83$=gp9wuGE61n=j~U0FFPFatRas}k zXIS}Obgb9`ycK_xBsGff?gUB3$p{~FHS1caFtKU{r z@fNfcanyJIWKHQk1LG2xhz|G5c>p*<{zP91=K@nq=GSo`ZpLNaX{YzjE z15anZ5-AtRCSaDFs#xpg9f(>U(Cj&wt?-L`kRq%Ks!TF2Q}6f_FTQFQfA6#vs8(rQ`UDoUhi5G<{7o;vL;JSJ(5Xb?&3T(VBi`z#)lJvHxI z1d9_`RUU-7(ep6Ia6-tK426+nlnAEjjq_si&$Q&9`SO${ph&*u%^)(GKuwY`y@(WlQ@T`z}WjP?hVw zDy4S>PZUOx_OwYo&UCn*FT|xnM58~uLMlr@x?;h*LaNivcz-k|Z3~VXO5}Tm3T>9J zK(R!%08+g~?V*)XE|efFS5H0u%lYn&ys7yD0ni^VAyuErXj4cwk)}PMwOzIh)Cavj zTH1z-XWS)xV_)AV<|u9$+@jZ0iT=gJlW}u(Yk9mKE}5Mhxdyf*>-_x|N` zu_6)Z<6R7Ff+wO|AFk2rATUi9uMVsz>~>dxmh-{{(`C9a$vy}q zbBN=r#4W4q2el9|^2ZKzeE`y~E$^#xB0{=oK{!!_;ZtmVHg?gHCX}b1dXDwltLzSQ zmvxKS3DqdZ*GZK9T6{#NIw@8PjRRE!G=WQ{u@dNnOAxV*MsZ5Zi(6JJbIBzWrQI!M zfiSODrmXXpf`;Y#WG;AS`a=xE3@X8T#p8p+IQ_MPVM9w z;?aAFS&yM*akymL@NQX@Xci70?2g(k1;g3v*zii_ddAakn;mY2ac4QTRP`;hF`(397B0!dN$}n(o}JF$Cv3LzM}(6N(dIYwXI|LrRP1}*z8*sipJKkXHTAEsjmOw7r=k{h3Bmc^%C(CwX=t& zwu*xqQp+ErIih5u5am%;uy3WlZVaa@;TBCF)O!ep`XdOgK2oKV&~Z6mC1 zj1hSHC(5R!K34b{GHJ*=6yEf6>P9rJjIB|1ITo&$T<4Y&KQcqGpj>50{1kgT-8O%e zC3DloLbN9QsF=H{d=WeRbTSJDBAyWr6mV}M0|vn&H%jBsRUxBKrT$o_I5EKpHf)v# zmxXo!tAFD4Ej9|jbPc^rC95pJEen^OP`mXyGh-@5S-@O3P!AQ`!nrSs*HOHi=RC569le|CG^a&|xaA8x# z`>Uw<3uK`PkQXwul^^FOLRx=-;7;_(Eo9fV14>=VkA`eNgeYP>(!hy(T_z%=hLh;# z(rkU^Mq5%X01s6yfM``ep^{BdrcI>x=ZIm~Uc#VlMw}xXHNCAa7d6o&V-5H;>~q*g z=^Ut8UHDW|xWD{r;guzjrpm)$vo$)n@*JhYdA6M6lUjqInyEMDdd z42@a|f<>Ch5v7Gxh7E#8ef^@nCC8+F1TCUq-kHJGGPAxRLi2U_ z;^>zm17&$}b#cW(D~ELF_eEwH#}|sM$`C|PIvg(mC}i_@EC;<-r!2W?vTpBMie3PL zUeYeW@r%I6FzP;Dlx-WS@`MFUUXPL_j)WJ$S;p6Mh3BHmtHqDrVGfF`bqd2jSjktU z*Df!9g6D-x#1^juDjAY-I|T=)BS?4S?X45_H{*(wo4aE~M=#X?_p@LzJE>-}u7wF9Eu8 zcffB1^&v!%tN6ErZ-fTYe^#S6Rdhq6;w$IIWON(EUwk{td;9vTSKqNQjBElbSH?mG zZHn&4Iu}U9elx#vIYe;q!6^*J>P0m6jVPzwPUF#cB4Yez>6D^R9x)DWL5Q7vq)VdV z<7(cH^avB~)HCViZE9hhq3paj$JomyT3|B9 zn6)f*^exxovu%cA9X<(Ln$DWJW3Q*k$;Kz)0=B#~iAd{E`hX9|X7Y=6l112HO^&Vn zV(EPx{OqZ2^d2A*u1l#9EPXO;+j}J)jWy`Fvb(NEQxmyOtXlc8Fnkz}u68k5YNtB8!|A;_`7AL+OX}20 z&DV)Czgoc7+7HWQ*CS45ca0J12%Dgkg|6U=Sr+1Thm+M#p}p^Dt9v#3DyRT(FbFUR zXc$CjSZHu?h+nVt10d1RG05IPp<$L3agyrwaIUmjDKU76yL-Tt_x*!LREx1bwK)>iYjPNg^PK6}T*9 zd&2o;bN6l)=lHH6i|aI_e`ng$(%cSV=-C{vD#Ra6nD1xwx!Ps<70L$7t{y|mJDNMj zHzS%;E8G1<6hS^xKSS^4d;G()GHkez9x96#toq3@jho95O$RM^rtd6>7*6AgW5@F! zLK|4x#S6vlS7r$rdKZ|eDq7c3eV?;F@V;fH3i+s%PC}KHrnH^rUuJ08+xno z5}|w&iJpR&MlBs)n+uj2v^Drl=y{+`(fsKvk1LQxLvMqpqD$g5>dD|r()m*GvCf+Q z>#){)dpkMj@h}`z+$0mtp37yPjy35lTOQ@WDnvH( zP9QrU3Jlviqew@((~aRtZ5m>>oID67F;g#+J; zBaLvW^4L)yq{-6(jQ=21`twS7pYwdrf68|Cl+<*G7t^RUq;IohcB}5v`tchg$tsT_ za7qk4NE{d7{iTKBG^U#DnkQ7`u)v_`+ZAe^%6Tx))%Y312H6! zf?X@c{^nv|gh_6%oMMb8YV zs2*__DTA_Cp-X_b)If-cLfw&EA=Dz+zH@pjobJi^P(wXP^}5N72%DV19B6;GYd9f! z*eOi52+dj)`7~-#@qOjAQti`9gbaf9yWSkBJ(k*Rbf+{ut5BER9!2^oJ@+}joHX3Q zD%@3mCE}rPypsiHop<~PPM#XO=wzy2sPQ-*p$22o&HI{vR!H9n zk!Y`in$TBetT|*cI*0BL6=s$!rryw`JJU=$n9J}VByfq**>n1g^EM4Cn<1pbXHK$! zwo|^mHDxHQ5+3H}09RDAwL@c0&<^c=>nWt56m*!_cfKTjJj}$@2gE`nB$2ey`Res) zfk-fs|3ZnrtwvRsMju@mznz6QfJ!8W*-;Hd^`KveI)G^Ia+%hamkSaS-VibtJuCe1 zJ@DF1wQEw6G_l%bTJ^QH0b&Jzy8Y;n8~wFSEB=$u*XJGg!mI7vF94~B$yjaayeNLb zm495SZn%VKlDqGh)E@MAIw{qgWw>I$@XYEVwBR`b`PzCZ?=?t;LF|ZXK&BD^LYAOp z(;S@BWCX(@z2pAnl%aI^ENP%Yx4XH^Q`SxDl|||e6`&3y{}fj+k+g1W?|3W5I7_pt zZB(&VuU|lEox;!MCdp0ieU#IaQ_qaOC%69oQ{h6?0X4JI!q8}O`%IH7`Kptdb1NbY zO5SNj9j!NT0}`19I*m`ZFS9m>(S^KiB1)HkPh3p%=j-@!v4c^2z;4@$@FQZ)uXb=PK| zi3h7t=A9B8h*=JnKvuT89wWG`<%C*%5ebfLvs%*Csi+sHx z+YjtjE)9!g8;_LF>YMH@#_$JItx?b8!P>b7ipx+gA~+pB>C;lA-E^IVoj%t!v9VF? zvqB>NbiFqZN-b&oS$1~eM|Pckwd`3M4sFdRRgufLej2mD=J6t|#yRRH8vO5lf~H^X z?Jf4sxvp`CIeqMR+b;g(I(4rrxvYi`bY71I!r=t`TC~WM6yvu4XxaC3L6j*^`MiWf z)#;o)_qg};_k;HDM5{Bbv=Fj*DsTwXntXnGo79^$DZu3uT5@7?YfkCQ?%|~fW$<3A zV=rxe7R|RDv2Nkc9gOQ02mK_`kg;QrCFBc_-N9niY@E^?3NeuJ)vehr3oVM=L9G;* z=`BuS+G@y9`c$UOiB-`1Wpbsa0TjEUCK&)<`L@h0vr8_c6q@aj9*X$On90$6kF$Z` zh*DMf#jI=hc?# zqwbbT@QRr$#2B4X05^W^&uZbvH(Acy(?X#7P;c_r0H7_j&BVc61mS}xmiHmVvg~fe z`*NX2KOs4xBb)Ul1q;6o+p=Td#k`tix;3YDYyuZ!Bo8sJC zFHKHp6+PuyoTq&OBy$e>Z%1!x89+!W&bIN4Wl7o`drB%#eg0;!V(=W+_zm@;ul!(! zUhk{%G=}sCP>{$qg36QZrGR~>TTKGw-NA0YHH-=9?facdrsEy$69UAq$Ax+i)d)lr zCzSW@T2xOm#qGcuZp~CYcqqGPxN=F*XIl9vkls`4DbJ*;2Z7z!McX?Ko^3oyE`5f!U^4@^V)Ge0q3pci?r^H1Lr?%n&t~Yvwhsr@mk@iOsP`I zp{4C@1veK#O5TYTXkoM2N4<`F+9%t2G7gwS6R`cFc*a) zo#hB$9^B`nUjX@9?L(t`J0Q^5xp0PpkN;2WJFWhXz^p{0wX9lBk{~;K3s1wbU4b5u z{vfu;zJTrKTDQ_ryWk_`W0{;`(@AMnwMv|nrE_n}Ru)y3TbusgxSkSz%icUoO+4OA zFhjH*z4li;5Az2Fy#*FnwTi1(0q&Olz!&<$!U4;9P2&dScIj_Q*sRB0W!N1}vrGO~j#A^N3+_jVw}0b_H^*>txV?4~(qgK=`0*q&4u%Msd6jHJ*6K8${t zuTr#QlX{U`#e+g&tzmtAdc5lqLs4c-WyD_X-?m{5ZlD}-B|93EKl7ktO4;`T^TzYwpl6`?!ofg;seXzqNprc> zdNPGBmLp;gWPtA+*_WFfZ=Z*@e+Us(QZD1d3?E^O5M^zgBoXa^AYQ)AX7d6ld_Nmm z7pVLr>1y^kGGj=@YfC`leC{&x>TsAazjSN?yIEClx-H26`~`4Pal~o&Z1*kEZiq0| zG>$q{?uw}FWit&T*cPl$wvZtnlu)}ei4r}2cSE@$;RpCT` zxds=*#2(-0&3mfyxcj#&xAWQ}Bsp0Z6;rxRCF9!?g>}BdbbQ@y8TL#^i<|aH#acZC zPjYvYpAQ7n1N<`W($NH>FO)56jkJRwrK*UmpY!fCDF(

*2Kn7% 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 literal 0 HcmV?d00001